#Boa:Dialog:Ventas

import wx
import wx.calendar
import wx.lib.buttons
from wx.lib.anchors import LayoutAnchors
import wx.lib.masked.textctrl
import wx.lib.masked.numctrl
import wx.grid
import MySQLdb
import Dialog2
import consultasBD
import ABMclientes
import Buscaclientes
from decimal import Decimal
import NoCodBarrasEncontrado
import formapago
import Modista
import Mensaje
import utiles
import Pagos
import CtasCtes
import Devoluciones
import Consignaciones
import sincronizar_tabla  
import ImpresionFiscal
import Imprimir
import BuscarCuota
import Facturacion
import concurso
import ModificaClientes
import ClubSussan
import sussanException
import ListadoPagosMigracion
import ListadoFacturas

import clubManager
import sellManager


#comentado el import siguiente porque no existe ningun mensaje.py
#import Mensaje

ROJO = (255, 145, 145, 255)
VERDE = (145, 255, 145, 255)
AZUL = (145, 145, 255, 255)
BLANCO = (255, 255, 255, 255)
AMARILLO = (254, 248, 191, 255)
    
def create(parent):
    return Ventas(parent)

[wxID_VENTAS, wxID_VENTASAGREGARPUNTOSBTN, wxID_VENTASBOTONCONSULTAR, 
 wxID_VENTASBOTONIMPRIMIR, wxID_VENTASBOTONPAGAR, wxID_VENTASBUSCAXAPELLIDO, 
 wxID_VENTASBUTTON1, wxID_VENTASBUTTON2, wxID_VENTASBUTTON3, 
 wxID_VENTASBUTTON4, wxID_VENTASBUTTON5, wxID_VENTASBUTTON6, 
 wxID_VENTASBUTTON7, wxID_VENTASBUTTON8, wxID_VENTASCHECKCONSULTACOMPLETA, 
 wxID_VENTASCHECKENFECHA, wxID_VENTASCHECKFUTURO, wxID_VENTASCHECKRANGOFECHAS, 
 wxID_VENTASCHECKRECARGO, wxID_VENTASCHECKTOTAL, wxID_VENTASCHECKVENCIDO, 
 wxID_VENTASCLUBBTN, wxID_VENTASCLUBTXT, wxID_VENTASCOMBOVENDEDORA, 
 wxID_VENTASCONSIGNACION, wxID_VENTASC_INACUMULADOS, wxID_VENTASC_INAPELLIDO, 
 wxID_VENTASC_INCODIGO, wxID_VENTASC_INCUMPLE, wxID_VENTASC_INDIRECCION, 
 wxID_VENTASC_INEMAIL, wxID_VENTASC_INTELEFONO, wxID_VENTASC_STATICTEXT10, 
 wxID_VENTASC_STATICTEXT11, wxID_VENTASC_STATICTEXT12, 
 wxID_VENTASC_STATICTEXT13, wxID_VENTASC_STATICTEXT14, 
 wxID_VENTASC_STATICTEXT7, wxID_VENTASC_STATICTEXT8, wxID_VENTASC_STATICTEXT9, 
 wxID_VENTASC_TEXTCTRL6, wxID_VENTASDEVOLUCION, wxID_VENTASFACTURACION, 
 wxID_VENTASFECHA, wxID_VENTASFECHADESDE, wxID_VENTASGRID1, wxID_VENTASGRID2, 
 wxID_VENTASGRID3, wxID_VENTASGRID4, wxID_VENTASINACUMULADOS, 
 wxID_VENTASINAPELLIDO, wxID_VENTASINCODIGO, wxID_VENTASINCONSIGNACION, 
 wxID_VENTASINCUMPLE, wxID_VENTASINDESC, wxID_VENTASINDIRECCION, 
 wxID_VENTASINEMAIL, wxID_VENTASINFECHA, wxID_VENTASINNROFACTURA, 
 wxID_VENTASINPAGANDO, wxID_VENTASINRECARGO, wxID_VENTASINSITUACIONFISCAL, 
 wxID_VENTASINTELEFONO, wxID_VENTASINTOTAL, wxID_VENTASINVENDEDORA, 
 wxID_VENTASIVA, wxID_VENTASIVADISCRIMINADO, wxID_VENTASLIMPIAR, 
 wxID_VENTASMODIFCLIENTE, wxID_VENTASNOTEBOOK1, wxID_VENTASOPCION, 
 wxID_VENTASPANEL1, wxID_VENTASPANEL2, wxID_VENTASPANEL3, wxID_VENTASPANEL4, 
 wxID_VENTASPANEL5, wxID_VENTASPANEL6, wxID_VENTASPANEL7, wxID_VENTASPANEL8, 
 wxID_VENTASPUNTOSDINEROTXT, wxID_VENTASPUNTOSTXT, wxID_VENTASRANGOFECHADESDE, 
 wxID_VENTASRANGOFECHAHASTA, wxID_VENTASSALDOINICIAL, wxID_VENTASSTATICBOX1, 
 wxID_VENTASSTATICLINE1, wxID_VENTASSTATICTEXT1, wxID_VENTASSTATICTEXT10, 
 wxID_VENTASSTATICTEXT11, wxID_VENTASSTATICTEXT12, wxID_VENTASSTATICTEXT13, 
 wxID_VENTASSTATICTEXT14, wxID_VENTASSTATICTEXT15, wxID_VENTASSTATICTEXT16, 
 wxID_VENTASSTATICTEXT17, wxID_VENTASSTATICTEXT2, wxID_VENTASSTATICTEXT3, 
 wxID_VENTASSTATICTEXT4, wxID_VENTASSTATICTEXT5, wxID_VENTASSTATICTEXT6, 
 wxID_VENTASSTATICTEXT7, wxID_VENTASSTATICTEXT8, wxID_VENTASSTATICTEXT9, 
 wxID_VENTASSUCUVENDEDORA, wxID_VENTASTEXTCTRL1, wxID_VENTASTEXTDESDE, 
 wxID_VENTASTEXTDEUDA, wxID_VENTASTEXTENFECHA, wxID_VENTASTEXTFUTURO, 
 wxID_VENTASTEXTMONTOAPAGAR, wxID_VENTASTEXTMONTOVAPAGANDO, 
 wxID_VENTASTEXTRANGODESDE, wxID_VENTASTEXTRANGOHASTA, wxID_VENTASTEXTRECARGO, 
 wxID_VENTASTEXTSALDOINICIAL, wxID_VENTASTEXTVENCIDO, 
 wxID_VENTASTXTACUMULADOS, wxID_VENTASTXTAPELLIDO, wxID_VENTASTXTCODIGO, 
 wxID_VENTASTXTCODIGOSUCURSAL, wxID_VENTASTXTCUMPLE, wxID_VENTASTXTDESC, 
 wxID_VENTASTXTDIRECCION, wxID_VENTASTXTEMAIL, wxID_VENTASTXTNROFACTURA, 
 wxID_VENTASTXTTELEFONO, wxID_VENTASTXTVENDEDORA, 
] = [wx.NewId() for _init_ctrls in range(127)]

class Ventas(wx.Dialog):
    def _init_coll_notebook1_Pages(self, parent):
        # generated method, don't edit

        parent.AddPage(imageId=-1, page=self.panel1, select=True,
              text='Cliente')
        parent.AddPage(imageId=-1, page=self.panel3, select=False,
              text='Cta Corriente')
        parent.AddPage(imageId=-1, page=self.panel4, select=False,
              text='Marketing')

    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_VENTAS, name='Ventas', parent=prnt,
              pos=wx.Point(111, 1), size=wx.Size(793, 658),
              style=wx.DEFAULT_DIALOG_STYLE, title='Facturacion')
        self.SetClientSize(wx.Size(785, 631))
        self.SetAutoLayout(True)
        self.SetForegroundColour(wx.Colour(0, 0, 0))
        self.SetBackgroundColour(wx.Colour(255, 255, 204))
        self.SetToolTipString('Ventas')

        self.fecha = wx.StaticText(id=wxID_VENTASFECHA, label='Fecha:',
              name='fecha', parent=self, pos=wx.Point(184, 8), size=wx.Size(34,
              13), style=0)
        self.fecha.SetToolTipString('staticText1')

        self.notebook1 = wx.Notebook(id=wxID_VENTASNOTEBOOK1, name='notebook1',
              parent=self, pos=wx.Point(8, 32), size=wx.Size(776, 616),
              style=0)
        self.notebook1.SetBackgroundColour(wx.Colour(238, 238, 238))
        self.notebook1.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
        self.notebook1.SetFitToCurrentPage(True)

        self.panel1 = wx.Panel(id=wxID_VENTASPANEL1, name='panel1',
              parent=self.notebook1, pos=wx.Point(0, 0), size=wx.Size(768, 590),
              style=wx.TAB_TRAVERSAL)
        self.panel1.SetBackgroundColour(wx.Colour(234, 234, 234))
        self.panel1.SetLabel('')

        self.panel3 = wx.Panel(id=wxID_VENTASPANEL3, name='panel3',
              parent=self.notebook1, pos=wx.Point(0, 0), size=wx.Size(768, 590),
              style=wx.TAB_TRAVERSAL)
        self.panel3.Show(False)

        self.panel4 = wx.Panel(id=wxID_VENTASPANEL4, name='panel4',
              parent=self.notebook1, pos=wx.Point(0, 0), size=wx.Size(768, 590),
              style=wx.TAB_TRAVERSAL)

        self.txtVendedora = wx.StaticText(id=wxID_VENTASTXTVENDEDORA,
              label='Vendedora', name='txtVendedora', parent=self,
              pos=wx.Point(335, 8), size=wx.Size(53, 13), style=0)

        self.inapellido = wx.TextCtrl(id=wxID_VENTASINAPELLIDO,
              name='inapellido', parent=self.panel1, pos=wx.Point(75, 40),
              size=wx.Size(240, 21), style=0, value='')
        self.inapellido.SetMaxLength(50)

        self.inemail = wx.TextCtrl(id=wxID_VENTASINEMAIL, name='inemail',
              parent=self.panel1, pos=wx.Point(416, 40), size=wx.Size(136, 21),
              style=0, value='')
        self.inemail.SetMaxLength(50)

        self.indireccion = wx.TextCtrl(id=wxID_VENTASINDIRECCION,
              name='indireccion', parent=self.panel1, pos=wx.Point(75, 64),
              size=wx.Size(240, 21), style=0, value='')
        self.indireccion.SetMaxLength(50)

        self.intelefono = wx.TextCtrl(id=wxID_VENTASINTELEFONO,
              name='intelefono', parent=self.panel1, pos=wx.Point(416, 64),
              size=wx.Size(136, 21), style=0, value='')
        self.intelefono.SetMaxLength(30)

        self.incumple = wx.TextCtrl(id=wxID_VENTASINCUMPLE, name='incumple',
              parent=self.panel1, pos=wx.Point(256, 88), size=wx.Size(59, 21),
              style=0, value='')
        self.incumple.SetMaxLength(5)

        self.buscaxapellido = wx.Button(id=wxID_VENTASBUSCAXAPELLIDO,
              label='Buscar', name='buscaxapellido', parent=self.panel1,
              pos=wx.Point(577, 8), size=wx.Size(79, 24), style=0)
        self.buscaxapellido.Bind(wx.EVT_BUTTON, self.OnBuscaxapellidoButton,
              id=wxID_VENTASBUSCAXAPELLIDO)

        self.limpiar = wx.Button(id=wxID_VENTASLIMPIAR, label='Limpiar',
              name='limpiar', parent=self.panel1, pos=wx.Point(576, 40),
              size=wx.Size(80, 24), style=0)
        self.limpiar.Bind(wx.EVT_BUTTON, self.OnBotonLimpiar,
              id=wxID_VENTASLIMPIAR)

        self.grid1 = wx.grid.Grid(id=wxID_VENTASGRID1, name='grid1',
              parent=self.panel1, pos=wx.Point(0, 144), size=wx.Size(678, 223),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnGrid1CambiaGrilla)

        self.inrecargo = wx.TextCtrl(id=wxID_VENTASINRECARGO, name='inrecargo',
              parent=self.panel1, pos=wx.Point(617, 383), size=wx.Size(47, 21),
              style=0, value='0.00')
        self.inrecargo.SetEditable(True)
        self.inrecargo.Bind(wx.EVT_TEXT_ENTER, self.OnInrecargoTextEnter,
              id=wxID_VENTASINRECARGO)
        self.inrecargo.Bind(wx.EVT_KILL_FOCUS, self.OnInrecargoKillFocus)

        self.grid2 = wx.grid.Grid(id=wxID_VENTASGRID2, name='grid2',
              parent=self.panel1, pos=wx.Point(0, 413), size=wx.Size(456, 112),
              style=0)
        self.grid2.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnGrid2FormaDePago)

        self.opcion = wx.RadioBox(choices=['Actualiza Server', 'NO Actualiza'],
              id=wxID_VENTASOPCION, label='Opciones:', majorDimension=1,
              name='opcion', parent=self.panel1, pos=wx.Point(460, 414),
              size=wx.Size(152, 64), style=wx.RA_SPECIFY_COLS)
        self.opcion.Enable(True)
        self.opcion.Show(False)
        self.opcion.SetStringSelection('Venta 2')
        self.opcion.Bind(wx.EVT_RADIOBOX, self.OnTipoVenta,
              id=wxID_VENTASOPCION)

        self.txtnrofactura = wx.StaticText(id=wxID_VENTASTXTNROFACTURA,
              label='Nro-Factura:', name='txtnrofactura', parent=self,
              pos=wx.Point(7, 9), size=wx.Size(63, 13), style=0)

        self.innrofactura = wx.TextCtrl(id=wxID_VENTASINNROFACTURA,
              name='innrofactura', parent=self, pos=wx.Point(72, 8),
              size=wx.Size(100, 21), style=0, value='')
        self.innrofactura.SetEditable(False)

        self.inconsignacion = wx.CheckBox(id=wxID_VENTASINCONSIGNACION,
              label='Entregar', name='inconsignacion', parent=self.panel1,
              pos=wx.Point(494, 515), size=wx.Size(88, 13), style=0)
        self.inconsignacion.SetValue(False)
        self.inconsignacion.Bind(wx.EVT_CHECKBOX, self.OnInconsignacionCheckbox,
              id=wxID_VENTASINCONSIGNACION)

        self.devolucion = wx.Button(id=wxID_VENTASDEVOLUCION,
              label='Devolucion', name='devolucion', parent=self.panel1,
              pos=wx.Point(680, 344), size=wx.Size(80, 32), style=0)
        self.devolucion.Bind(wx.EVT_BUTTON, self.OnDevolucionClick,
              id=wxID_VENTASDEVOLUCION)

        self.facturacion = wx.Button(id=wxID_VENTASFACTURACION,
              label='Facturar', name='facturacion', parent=self.panel1,
              pos=wx.Point(648, 504), size=wx.Size(105, 31), style=0)
        self.facturacion.Bind(wx.EVT_BUTTON, self.OnFacturacionButton,
              id=wxID_VENTASFACTURACION)

        self.button2 = wx.Button(id=wxID_VENTASBUTTON2, label='Actualizar',
              name='button2', parent=self.panel1, pos=wx.Point(680, 8),
              size=wx.Size(80, 24), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnButton2Actualizar,
              id=wxID_VENTASBUTTON2)

        self.button1 = wx.Button(id=wxID_VENTASBUTTON1, label='Nuevo Cliente',
              name='button1', parent=self.panel1, pos=wx.Point(680, 40),
              size=wx.Size(80, 24), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnBotonnuevoclienteButton,
              id=wxID_VENTASBUTTON1)

        self.txtapellido = wx.StaticText(id=wxID_VENTASTXTAPELLIDO,
              label='Apellido', name='txtapellido', parent=self.panel1,
              pos=wx.Point(12, 40), size=wx.Size(37, 13), style=0)

        self.txtdireccion = wx.StaticText(id=wxID_VENTASTXTDIRECCION,
              label='Direcci\xf3n', name='txtdireccion', parent=self.panel1,
              pos=wx.Point(12, 64), size=wx.Size(43, 13), style=0)

        self.txttelefono = wx.StaticText(id=wxID_VENTASTXTTELEFONO,
              label='Tel\xe9fono', name='txttelefono', parent=self.panel1,
              pos=wx.Point(328, 64), size=wx.Size(42, 13), style=0)

        self.txtacumulados = wx.StaticText(id=wxID_VENTASTXTACUMULADOS,
              label='$ Acumulados', name='txtacumulados', parent=self.panel1,
              pos=wx.Point(328, 88), size=wx.Size(66, 13), style=0)

        self.txtemail = wx.StaticText(id=wxID_VENTASTXTEMAIL, label='E-mail',
              name='txtemail', parent=self.panel1, pos=wx.Point(328, 40),
              size=wx.Size(28, 13), style=0)

        self.txtcumple = wx.StaticText(id=wxID_VENTASTXTCUMPLE,
              label='Cumplea\xf1os', name='txtcumple', parent=self.panel1,
              pos=wx.Point(196, 88), size=wx.Size(58, 13), style=0)

        self.txtcodigo = wx.StaticText(id=wxID_VENTASTXTCODIGO, label='Codigo',
              name='txtcodigo', parent=self.panel1, pos=wx.Point(12, 8),
              size=wx.Size(33, 13), style=0)

        self.staticText1 = wx.StaticText(id=wxID_VENTASSTATICTEXT1,
              label='Formas de Pago:', name='staticText1', parent=self.panel1,
              pos=wx.Point(8, 368), size=wx.Size(82, 13), style=0)

        self.staticText2 = wx.StaticText(id=wxID_VENTASSTATICTEXT2, label='Iva',
              name='staticText2', parent=self.panel1, pos=wx.Point(680, 384),
              size=wx.Size(16, 13), style=0)

        self.staticText3 = wx.StaticText(id=wxID_VENTASSTATICTEXT3, label='IVA',
              name='staticText3', parent=self.panel1, pos=wx.Point(12, 88),
              size=wx.Size(17, 13), style=0)

        self.staticText4 = wx.StaticText(id=wxID_VENTASSTATICTEXT4,
              label='Total sin Iva', name='staticText4', parent=self.panel1,
              pos=wx.Point(648, 408), size=wx.Size(59, 13), style=0)

        self.staticText5 = wx.StaticText(id=wxID_VENTASSTATICTEXT5,
              label='Total', name='staticText5', parent=self.panel1,
              pos=wx.Point(648, 449), size=wx.Size(24, 13), style=0)

        self.staticText6 = wx.StaticText(id=wxID_VENTASSTATICTEXT6,
              label='Va Pagando:', name='staticText6', parent=self.panel1,
              pos=wx.Point(313, 541), size=wx.Size(62, 13), style=0)

        self.staticBox1 = wx.StaticBox(id=wxID_VENTASSTATICBOX1,
              label=u'Consignaci\xf3n', name='staticBox1', parent=self.panel1,
              pos=wx.Point(462, 496), size=wx.Size(154, 40), style=0)

        self.txtdesc = wx.StaticText(id=wxID_VENTASTXTDESC, label='Desc %',
              name='txtdesc', parent=self.panel1, pos=wx.Point(464, 384),
              size=wx.Size(37, 13), style=0)

        self.infecha = wx.DatePickerCtrl(id=wxID_VENTASINFECHA, name='infecha',
              parent=self, pos=wx.Point(224, 6), size=wx.Size(96, 21),
              style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
        self.infecha.Enable(False)
        self.infecha.SetLabel('')

        self.incodigo = wx.TextCtrl(id=wxID_VENTASINCODIGO, name='incodigo',
              parent=self.panel1, pos=wx.Point(75, 8), size=wx.Size(77, 21),
              style=0, value='')
        self.incodigo.SetEditable(True)
        self.incodigo.Enable(True)
        self.incodigo.Bind(wx.EVT_KILL_FOCUS, self.OnIncodigoKillFocus)

        self.inSituacionFiscal = wx.TextCtrl(id=wxID_VENTASINSITUACIONFISCAL,
              name='inSituacionFiscal', parent=self.panel1, pos=wx.Point(75,
              88), size=wx.Size(101, 21), style=0, value='')
        self.inSituacionFiscal.SetEditable(False)

        self.inacumulados = wx.TextCtrl(id=wxID_VENTASINACUMULADOS,
              name='inacumulados', parent=self.panel1, pos=wx.Point(416, 88),
              size=wx.Size(136, 21), style=0, value='')
        self.inacumulados.SetEditable(False)

        self.inpagando = wx.TextCtrl(id=wxID_VENTASINPAGANDO, name='inpagando',
              parent=self.panel1, pos=wx.Point(384, 537), size=wx.Size(72, 21),
              style=0, value='0.00')
        self.inpagando.SetEditable(False)

        self.iva = wx.TextCtrl(id=wxID_VENTASIVA, name='iva',
              parent=self.panel1, pos=wx.Point(704, 384), size=wx.Size(48, 21),
              style=0, value='0.00')
        self.iva.SetEditable(False)

        self.checkConsultaCompleta = wx.CheckBox(id=wxID_VENTASCHECKCONSULTACOMPLETA,
              label='Consulta completa', name='checkConsultaCompleta',
              parent=self.panel3, pos=wx.Point(584, 16), size=wx.Size(120, 13),
              style=0)
        self.checkConsultaCompleta.SetValue(False)
        self.checkConsultaCompleta.Bind(wx.EVT_CHECKBOX,
              self.OnConsultaCompleta, id=wxID_VENTASCHECKCONSULTACOMPLETA)

        self.fechaDesde = wx.DatePickerCtrl(id=wxID_VENTASFECHADESDE,
              name='fechaDesde', parent=self.panel3, pos=wx.Point(678, 40),
              size=wx.Size(88, 21), style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
        self.fechaDesde.Enable(False)

        self.checkRangoFechas = wx.CheckBox(id=wxID_VENTASCHECKRANGOFECHAS,
              label='Rango de fechas', name='checkRangoFechas',
              parent=self.panel3, pos=wx.Point(584, 72), size=wx.Size(112, 13),
              style=0)
        self.checkRangoFechas.SetValue(False)
        self.checkRangoFechas.Bind(wx.EVT_CHECKBOX, self.OnRangoFechas,
              id=wxID_VENTASCHECKRANGOFECHAS)

        self.rangoFechaHasta = wx.DatePickerCtrl(id=wxID_VENTASRANGOFECHAHASTA,
              name='rangoFechaHasta', parent=self.panel3, pos=wx.Point(677,
              128), size=wx.Size(88, 21),
              style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
        self.rangoFechaHasta.Enable(False)

        self.rangoFechaDesde = wx.DatePickerCtrl(id=wxID_VENTASRANGOFECHADESDE,
              name='rangoFechaDesde', parent=self.panel3, pos=wx.Point(677, 96),
              size=wx.Size(88, 21), style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)
        self.rangoFechaDesde.Enable(False)

        self.botonConsultar = wx.Button(id=wxID_VENTASBOTONCONSULTAR,
              label='Consultar', name='botonConsultar', parent=self.panel3,
              pos=wx.Point(584, 219), size=wx.Size(75, 23), style=0)
        self.botonConsultar.Bind(wx.EVT_BUTTON, self.OnBotonConsultar,
              id=wxID_VENTASBOTONCONSULTAR)

        self.botonImprimir = wx.Button(id=wxID_VENTASBOTONIMPRIMIR,
              label='Imprimir', name='botonImprimir', parent=self.panel3,
              pos=wx.Point(680, 219), size=wx.Size(80, 23), style=0)
        self.botonImprimir.Bind(wx.EVT_BUTTON, self.OnBotonImprimir,
              id=wxID_VENTASBOTONIMPRIMIR)

        self.grid3 = wx.grid.Grid(id=wxID_VENTASGRID3, name='grid3',
              parent=self.panel3, pos=wx.Point(0, 80), size=wx.Size(568, 224),
              style=0)
        self.grid3.SetWindowVariant(wx.WINDOW_VARIANT_NORMAL)
        self.grid3.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK,
              self.OnProcesarDobleClick)
        self.grid3.Bind(wx.grid.EVT_GRID_CELL_RIGHT_DCLICK,
              self.OnProcesarRecargo)

        self.panel2 = wx.Panel(id=wxID_VENTASPANEL2, name='panel2',
              parent=self.panel3, pos=wx.Point(584, 295), size=wx.Size(96, 24),
              style=wx.TAB_TRAVERSAL)
        self.panel2.SetBackgroundColour(wx.Colour(255, 145, 145))

        self.panel7 = wx.Panel(id=wxID_VENTASPANEL7, name='panel7',
              parent=self.panel3, pos=wx.Point(584, 322), size=wx.Size(96, 24),
              style=wx.TAB_TRAVERSAL)
        self.panel7.SetBackgroundColour(wx.Colour(254, 248, 191))

        self.panel5 = wx.Panel(id=wxID_VENTASPANEL5, name='panel5',
              parent=self.panel3, pos=wx.Point(584, 349), size=wx.Size(96, 24),
              style=wx.TAB_TRAVERSAL)
        self.panel5.SetBackgroundColour(wx.Colour(145, 255, 145))

        self.panel8 = wx.Panel(id=wxID_VENTASPANEL8, name='panel8',
              parent=self.panel3, pos=wx.Point(464, 424), size=wx.Size(104, 24),
              style=wx.TAB_TRAVERSAL)
        self.panel8.SetBackgroundColour(wx.Colour(255, 255, 255))

        self.panel6 = wx.Panel(id=wxID_VENTASPANEL6, name='panel6',
              parent=self.panel3, pos=wx.Point(584, 376), size=wx.Size(96, 24),
              style=wx.TAB_TRAVERSAL)
        self.panel6.SetBackgroundColour(wx.Colour(145, 145, 255))

        self.grid4 = wx.grid.Grid(id=wxID_VENTASGRID3, name='grid4',
              parent=self.panel3, pos=wx.Point(0, 312), size=wx.Size(456, 112),
              style=0)
        self.grid4.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnGrid4FormaPago)

        self.botonPagar = wx.Button(id=wxID_VENTASBOTONPAGAR, label='Pagar',
              name='botonPagar', parent=self.panel3, pos=wx.Point(688, 416),
              size=wx.Size(78, 34), style=0)
        self.botonPagar.Bind(wx.EVT_BUTTON, self.OnBotonPagar,
              id=wxID_VENTASBOTONPAGAR)

        self.button3 = wx.Button(id=wxID_VENTASBUTTON3, label='Pagar Saldo',
              name='button3', parent=self.panel3, pos=wx.Point(472, 364),
              size=wx.Size(88, 32), style=0)
        self.button3.Show(False)
        self.button3.Bind(wx.EVT_BUTTON, self.OnPagarSaldoInicial,
              id=wxID_VENTASBUTTON3)

        self.ivadiscriminado = wx.TextCtrl(id=wxID_VENTASIVADISCRIMINADO,
              name='ivadiscriminado', parent=self.panel1, pos=wx.Point(648,
              424), size=wx.Size(105, 21), style=0, value='0.00')
        self.ivadiscriminado.SetEditable(False)

        self.saldoinicial = wx.StaticText(id=wxID_VENTASSALDOINICIAL,
              label=u'Saldo migraci\xf3n', name='saldoinicial',
              parent=self.panel3, pos=wx.Point(474, 321), size=wx.Size(74, 13),
              style=0)
        self.saldoinicial.Show(False)

        self.c_staticText7 = wx.StaticText(id=wxID_VENTASC_STATICTEXT7,
              label='Codigo:', name='c_staticText7', parent=self.panel3,
              pos=wx.Point(6, 8), size=wx.Size(37, 13), style=0)

        self.c_incodigo = wx.TextCtrl(id=wxID_VENTASC_INCODIGO,
              name='c_incodigo', parent=self.panel3, pos=wx.Point(43, 8),
              size=wx.Size(61, 21), style=0, value='')
        self.c_incodigo.SetEditable(False)

        self.c_staticText8 = wx.StaticText(id=wxID_VENTASC_STATICTEXT8,
              label='Apellido:', name='c_staticText8', parent=self.panel3,
              pos=wx.Point(108, 8), size=wx.Size(41, 13), style=0)

        self.c_inapellido = wx.TextCtrl(id=wxID_VENTASC_INAPELLIDO,
              name='c_inapellido', parent=self.panel3, pos=wx.Point(155, 8),
              size=wx.Size(224, 21), style=0, value='')
        self.c_inapellido.SetEditable(False)

        self.c_staticText9 = wx.StaticText(id=wxID_VENTASC_STATICTEXT9,
              label=u'Cumplea\xf1os:', name='c_staticText9', parent=self.panel3,
              pos=wx.Point(252, 56), size=wx.Size(62, 13), style=0)

        self.c_incumple = wx.TextCtrl(id=wxID_VENTASC_INCUMPLE,
              name='c_incumple', parent=self.panel3, pos=wx.Point(323, 56),
              size=wx.Size(56, 21), style=0, value='')
        self.c_incumple.SetEditable(False)

        self.c_staticText10 = wx.StaticText(id=wxID_VENTASC_STATICTEXT10,
              label=u'Direcci\xf3n:', name='c_staticText10', parent=self.panel3,
              pos=wx.Point(108, 32), size=wx.Size(47, 13), style=0)

        self.c_indireccion = wx.TextCtrl(id=wxID_VENTASC_INDIRECCION,
              name='c_indireccion', parent=self.panel3, pos=wx.Point(155, 32),
              size=wx.Size(224, 21), style=0, value='')
        self.c_indireccion.SetEditable(False)

        self.c_staticText11 = wx.StaticText(id=wxID_VENTASC_STATICTEXT11,
              label=u'Tel\xe9fono:', name='c_staticText11', parent=self.panel3,
              pos=wx.Point(384, 32), size=wx.Size(46, 13), style=0)

        self.c_intelefono = wx.TextCtrl(id=wxID_VENTASC_INTELEFONO,
              name='c_intelefono', parent=self.panel3, pos=wx.Point(440, 32),
              size=wx.Size(128, 21), style=0, value='')
        self.c_intelefono.SetEditable(False)

        self.c_staticText12 = wx.StaticText(id=wxID_VENTASC_STATICTEXT12,
              label='IVA:', name='c_staticText12', parent=self.panel3,
              pos=wx.Point(108, 56), size=wx.Size(21, 13), style=0)

        self.c_textCtrl6 = wx.TextCtrl(id=wxID_VENTASC_TEXTCTRL6,
              name='c_textCtrl6', parent=self.panel3, pos=wx.Point(155, 56),
              size=wx.Size(88, 21), style=0, value='')
        self.c_textCtrl6.SetEditable(False)

        self.c_staticText13 = wx.StaticText(id=wxID_VENTASC_STATICTEXT13,
              label='$ Acumulados:', name='c_staticText13', parent=self.panel3,
              pos=wx.Point(384, 56), size=wx.Size(70, 13), style=0)

        self.c_inacumulados = wx.TextCtrl(id=wxID_VENTASC_INACUMULADOS,
              name='c_inacumulados', parent=self.panel3, pos=wx.Point(464, 56),
              size=wx.Size(104, 21), style=0, value='')
        self.c_inacumulados.SetEditable(False)

        self.c_staticText14 = wx.StaticText(id=wxID_VENTASC_STATICTEXT14,
              label='E-mail:', name='c_staticText14', parent=self.panel3,
              pos=wx.Point(384, 8), size=wx.Size(32, 13), style=0)

        self.c_inemail = wx.TextCtrl(id=wxID_VENTASC_INEMAIL, name='c_inemail',
              parent=self.panel3, pos=wx.Point(440, 8), size=wx.Size(128, 21),
              style=0, value='')
        self.c_inemail.SetEditable(False)

        self.textDesde = wx.StaticText(id=wxID_VENTASTEXTDESDE, label='Desde',
              name='textDesde', parent=self.panel3, pos=wx.Point(584, 40),
              size=wx.Size(30, 13), style=0)
        self.textDesde.Enable(False)

        self.textRangoHasta = wx.StaticText(id=wxID_VENTASTEXTRANGOHASTA,
              label='Hasta', name='textRangoHasta', parent=self.panel3,
              pos=wx.Point(584, 128), size=wx.Size(28, 13), style=0)
        self.textRangoHasta.Enable(False)

        self.textRangoDesde = wx.StaticText(id=wxID_VENTASTEXTRANGODESDE,
              label='Desde', name='textRangoDesde', parent=self.panel3,
              pos=wx.Point(584, 96), size=wx.Size(30, 13), style=0)
        self.textRangoDesde.Enable(False)

        self.textMontoAPagar = wx.TextCtrl(id=wxID_VENTASTEXTMONTOAPAGAR,
              name='textMontoAPagar', parent=self.panel3, pos=wx.Point(584,
              424), size=wx.Size(96, 21), style=0, value='0.00')
        self.textMontoAPagar.SetEditable(True)
        self.textMontoAPagar.Bind(wx.EVT_TEXT, self.OnMontoAPagar,
              id=wxID_VENTASTEXTMONTOAPAGAR)

        self.textMontoVaPagando = wx.TextCtrl(id=wxID_VENTASTEXTMONTOVAPAGANDO,
              name='textMontoVaPagando', parent=self.panel3, pos=wx.Point(400,
              427), size=wx.Size(56, 21), style=0, value='0.00')
        self.textMontoVaPagando.SetEditable(False)

        self.textSaldoInicial = wx.TextCtrl(id=wxID_VENTASTEXTSALDOINICIAL,
              name='textSaldoInicial', parent=self.panel3, pos=wx.Point(473,
              339), size=wx.Size(88, 21), style=0, value='0.00')
        self.textSaldoInicial.SetEditable(False)
        self.textSaldoInicial.Show(False)

        self.staticText7 = wx.StaticText(id=wxID_VENTASSTATICTEXT7,
              label='Va Pagando', name='staticText7', parent=self.panel3,
              pos=wx.Point(336, 432), size=wx.Size(58, 13), style=0)

        self.checkVencido = wx.CheckBox(id=wxID_VENTASCHECKVENCIDO, label='',
              name='checkVencido', parent=self.panel2, pos=wx.Point(80, 8),
              size=wx.Size(16, 13), style=0)
        self.checkVencido.SetValue(False)
        self.checkVencido.Bind(wx.EVT_CHECKBOX, self.OnVencido,
              id=wxID_VENTASCHECKVENCIDO)

        self.checkEnFecha = wx.CheckBox(id=wxID_VENTASCHECKENFECHA, label='',
              name='checkEnFecha', parent=self.panel5, pos=wx.Point(80, 8),
              size=wx.Size(16, 13), style=0)
        self.checkEnFecha.SetValue(False)
        self.checkEnFecha.Bind(wx.EVT_CHECKBOX, self.OnEnFecha,
              id=wxID_VENTASCHECKENFECHA)

        self.checkFuturo = wx.CheckBox(id=wxID_VENTASCHECKFUTURO, label='',
              name='checkFuturo', parent=self.panel6, pos=wx.Point(80, 8),
              size=wx.Size(16, 13), style=0)
        self.checkFuturo.SetValue(False)
        self.checkFuturo.Bind(wx.EVT_CHECKBOX, self.OnFuturo,
              id=wxID_VENTASCHECKFUTURO)

        self.textEnFecha = wx.StaticText(id=wxID_VENTASTEXTENFECHA,
              label='0.00', name='textEnFecha', parent=self.panel5,
              pos=wx.Point(8, 8), size=wx.Size(64, 13), style=0)

        self.textFuturo = wx.StaticText(id=wxID_VENTASTEXTFUTURO, label='0.00',
              name='textFuturo', parent=self.panel6, pos=wx.Point(8, 8),
              size=wx.Size(64, 13), style=0)

        self.textVencido = wx.StaticText(id=wxID_VENTASTEXTVENCIDO,
              label='0.00', name='textVencido', parent=self.panel2,
              pos=wx.Point(8, 5), size=wx.Size(64, 13), style=0)

        self.intotal = wx.TextCtrl(id=wxID_VENTASINTOTAL, name='intotal',
              parent=self.panel1, pos=wx.Point(648, 473), size=wx.Size(104, 21),
              style=0, value='0.00')
        self.intotal.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.intotal.SetEditable(False)

        self.comboVendedora = wx.ComboBox(choices=[],
              id=wxID_VENTASCOMBOVENDEDORA, name='comboVendedora', parent=self,
              pos=wx.Point(616, 8), size=wx.Size(159, 21), style=0,
              value='Vendedoras...')
        self.comboVendedora.SetLabel('Vendedoras...')
        self.comboVendedora.Bind(wx.EVT_COMBOBOX, self.OnComboVendedoraCombobox,
              id=wxID_VENTASCOMBOVENDEDORA)

        self.checkRecargo = wx.CheckBox(id=wxID_VENTASCHECKRECARGO, label='',
              name='checkRecargo', parent=self.panel7, pos=wx.Point(80, 8),
              size=wx.Size(16, 13), style=0)
        self.checkRecargo.SetValue(False)
        self.checkRecargo.Bind(wx.EVT_CHECKBOX, self.OnRecargo,
              id=wxID_VENTASCHECKRECARGO)

        self.textRecargo = wx.StaticText(id=wxID_VENTASTEXTRECARGO,
              label='0.00', name='textRecargo', parent=self.panel7,
              pos=wx.Point(8, 8), size=wx.Size(64, 13), style=0)

        self.textDeuda = wx.StaticText(id=wxID_VENTASTEXTDEUDA, label='0.00',
              name='textDeuda', parent=self.panel8, pos=wx.Point(6, 8),
              size=wx.Size(48, 13), style=0)

        self.checkTotal = wx.CheckBox(id=wxID_VENTASCHECKTOTAL, label='',
              name='checkTotal', parent=self.panel8, pos=wx.Point(88, 8),
              size=wx.Size(16, 13), style=0)
        self.checkTotal.SetValue(False)
        self.checkTotal.Bind(wx.EVT_CHECKBOX, self.OnTotalDeuda,
              id=wxID_VENTASCHECKTOTAL)

        self.staticText8 = wx.StaticText(id=wxID_VENTASSTATICTEXT8,
              label='Total Deuda', name='staticText8', parent=self.panel3,
              pos=wx.Point(462, 408), size=wx.Size(58, 13), style=0)

        self.staticText10 = wx.StaticText(id=wxID_VENTASSTATICTEXT10,
              label='Monto a pagar', name='staticText10', parent=self.panel3,
              pos=wx.Point(584, 408), size=wx.Size(70, 13), style=0)

        self.staticText11 = wx.StaticText(id=wxID_VENTASSTATICTEXT11,
              label='Formas de pago', name='staticText11', parent=self.panel3,
              pos=wx.Point(8, 312), size=wx.Size(77, 13), style=0)

        self.staticText9 = wx.StaticText(id=wxID_VENTASSTATICTEXT9,
              label='Vencido', name='staticText9', parent=self.panel3,
              pos=wx.Point(688, 295), size=wx.Size(38, 13), style=0)

        self.staticText12 = wx.StaticText(id=wxID_VENTASSTATICTEXT12,
              label='Recargos', name='staticText12', parent=self.panel3,
              pos=wx.Point(688, 321), size=wx.Size(45, 13), style=0)

        self.staticLine1 = wx.StaticLine(id=wxID_VENTASSTATICLINE1,
              name='staticLine1', parent=self.panel3, pos=wx.Point(590, 264),
              size=wx.Size(168, 2), style=0)

        self.staticText13 = wx.StaticText(id=wxID_VENTASSTATICTEXT13,
              label='Vence hoy', name='staticText13', parent=self.panel3,
              pos=wx.Point(687, 349), size=wx.Size(51, 13), style=0)

        self.invendedora = wx.TextCtrl(id=wxID_VENTASINVENDEDORA,
              name='invendedora', parent=self, pos=wx.Point(576, 8),
              size=wx.Size(32, 21), style=0, value='')
        self.invendedora.SetEditable(False)

        self.button4 = wx.Button(id=wxID_VENTASBUTTON4, label='Buscar Cuota',
              name='button4', parent=self.panel3, pos=wx.Point(584, 184),
              size=wx.Size(75, 23), style=0)
        self.button4.Bind(wx.EVT_BUTTON, self.OnBuscarCuota,
              id=wxID_VENTASBUTTON4)

        self.consignacion = wx.Button(id=wxID_VENTASCONSIGNACION,
              label='Consignacion', name='consignacion', parent=self.panel1,
              pos=wx.Point(680, 304), size=wx.Size(80, 31), style=0)
        self.consignacion.Bind(wx.EVT_BUTTON, self.OnConsignacion,
              id=wxID_VENTASCONSIGNACION)

        self.modifCliente = wx.Button(id=wxID_VENTASMODIFCLIENTE,
              label='Mod. Cliente', name='modifCliente', parent=self.panel1,
              pos=wx.Point(576, 72), size=wx.Size(80, 24), style=0)
        self.modifCliente.Bind(wx.EVT_BUTTON, self.OnModifClienteButton,
              id=wxID_VENTASMODIFCLIENTE)

        self.staticText14 = wx.StaticText(id=wxID_VENTASSTATICTEXT14,
              label='Recargo %:', name='staticText14', parent=self.panel1,
              pos=wx.Point(560, 384), size=wx.Size(59, 13), style=0)

        self.indesc = wx.TextCtrl(id=wxID_VENTASINDESC, name='indesc',
              parent=self.panel1, pos=wx.Point(505, 383), size=wx.Size(47, 21),
              style=0, value='0.00')
        self.indesc.SetEditable(False)
        self.indesc.Bind(wx.EVT_TEXT_ENTER, self.OnDescuentoEnter,
              id=wxID_VENTASINDESC)
        self.indesc.Bind(wx.EVT_KILL_FOCUS, self.OnDescuentoPerderFoco)

        self.staticText15 = wx.StaticText(id=wxID_VENTASSTATICTEXT15,
              label='Club:', name='staticText15', parent=self.panel1,
              pos=wx.Point(176, 16), size=wx.Size(31, 12), style=0)

        self.clubTxt = wx.TextCtrl(id=wxID_VENTASCLUBTXT, name='clubTxt',
              parent=self.panel1, pos=wx.Point(216, 8), size=wx.Size(200, 21),
              style=0, value='')
        self.clubTxt.SetMaxLength(20)
        self.clubTxt.Bind(wx.EVT_KILL_FOCUS, self.OnClubKillFocus)

        self.ClubBtn = wx.Button(id=wxID_VENTASCLUBBTN, label='Sussan Club',
              name='ClubBtn', parent=self.panel1, pos=wx.Point(680, 72),
              size=wx.Size(80, 24), style=0)
        self.ClubBtn.Bind(wx.EVT_BUTTON, self.OnClubButton,
              id=wxID_VENTASCLUBBTN)

        self.staticText16 = wx.StaticText(id=wxID_VENTASSTATICTEXT16,
              label='Puntos:', name='staticText16', parent=self.panel1,
              pos=wx.Point(9, 390), size=wx.Size(39, 13), style=0)

        self.puntosTxt = wx.TextCtrl(id=wxID_VENTASPUNTOSTXT, name='puntosTxt',
              parent=self.panel1, pos=wx.Point(83, 387), size=wx.Size(70, 21),
              style=0, value='0')
        self.puntosTxt.Bind(wx.EVT_KILL_FOCUS, self.OnPuntosTxtKillFocus)

        self.puntosDineroTxt = wx.TextCtrl(id=wxID_VENTASPUNTOSDINEROTXT,
              name='puntosDineroTxt', parent=self.panel1, pos=wx.Point(155,
              386), size=wx.Size(70, 21), style=0, value='0.00')
        self.puntosDineroTxt.Bind(wx.EVT_KILL_FOCUS,
              self.OnPuntosDineroTxtKillFocus)

        self.agregarPuntosBtn = wx.Button(id=wxID_VENTASAGREGARPUNTOSBTN,
              label='Agregar', name='agregarPuntosBtn', parent=self.panel1,
              pos=wx.Point(230, 385), size=wx.Size(75, 23), style=0)
        self.agregarPuntosBtn.Bind(wx.EVT_BUTTON, self.OnAgregarPuntosBtnButton,
              id=wxID_VENTASAGREGARPUNTOSBTN)

        self.sucuVendedora = wx.ComboBox(choices=[],
              id=wxID_VENTASSUCUVENDEDORA, name='sucuVendedora', parent=self,
              pos=wx.Point(392, 8), size=wx.Size(176, 21), style=0, value='')
        self.sucuVendedora.SetLabel('')
        self.sucuVendedora.Bind(wx.EVT_COMBOBOX, self.OnSucuVendedoraCombobox,
              id=wxID_VENTASSUCUVENDEDORA)

        self.txtCodigoSucursal = wx.StaticText(id=wxID_VENTASTXTCODIGOSUCURSAL,
              label='', name='txtCodigoSucursal', parent=self, pos=wx.Point(560,
              8), size=wx.Size(0, 13), style=0)
        self.txtCodigoSucursal.Enable(False)
        self.txtCodigoSucursal.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL,
              wx.NORMAL, False, 'Tahoma'))

        self.button5 = wx.Button(id=wxID_VENTASBUTTON5, label='Historico Pagos',
              name='button5', parent=self.panel3, pos=wx.Point(8, 432),
              size=wx.Size(88, 24), style=0)
        self.button5.Bind(wx.EVT_BUTTON, self.OnHistorioPagos,
              id=wxID_VENTASBUTTON5)

        self.button6 = wx.Button(id=wxID_VENTASBUTTON6,
              label='Detalle Facturas', name='button6', parent=self.panel3,
              pos=wx.Point(104, 432), size=wx.Size(88, 24), style=0)
        self.button6.Bind(wx.EVT_BUTTON, self.OnDetalleFacturas,
              id=wxID_VENTASBUTTON6)

        self.button7 = wx.Button(id=wxID_VENTASBUTTON7, label='Crear Senia',
              name='button7', parent=self.panel1, pos=wx.Point(680, 216),
              size=wx.Size(75, 23), style=0)
        self.button7.Bind(wx.EVT_BUTTON, self.OnCrearSenia,
              id=wxID_VENTASBUTTON7)

        self.button8 = wx.Button(id=wxID_VENTASBUTTON8, label='Fact. Senia',
              name='button8', parent=self.panel1, pos=wx.Point(680, 240),
              size=wx.Size(75, 23), style=0)
        self.button8.Enable(True)
        self.button8.Bind(wx.EVT_BUTTON, self.OnFacturarSenia,
              id=wxID_VENTASBUTTON8)

        self.staticText17 = wx.StaticText(id=wxID_VENTASSTATICTEXT17,
              label='Nro.Doc.', name='staticText17', parent=self.panel1,
              pos=wx.Point(12, 112), size=wx.Size(43, 13), style=0)

        self.textCtrl1 = wx.TextCtrl(id=wxID_VENTASTEXTCTRL1, name='textCtrl1',
              parent=self.panel1, pos=wx.Point(75, 112), size=wx.Size(101, 21),
              style=0, value='')

        self._init_coll_notebook1_Pages(self.notebook1)

    def __init__(self, parent):
        self.padre = parent
        self.sucursal= self.padre.sucursalNro
        self.sussanClub = False        
        
        self._init_ctrls(parent)

        self.cargarSucursalVendedora()
        self.cargarComboVendedora()
        self.valores = {} # self.valores lleva los importes que se van ingresando
        self.valores['resto'] = 0.0
        self.pagos = {} # self.pagos lleva un referencia renglon --> cod. del valor de pago 
        self.listaproductos = [] #esta lista carga los productos para hacer la baja
        self.haycliente = 0 #para cuando este cargado el cliente
        self.CtaCtePagos_detalle = [] #lista conteniendo los renglones que se pagan
        self.totalCuotas = { 1:Decimal("0.0"), 2:Decimal("0.0"), 3:Decimal("0.0"), 4:Decimal("0.0") } 
        self.totalAPagar = Decimal("0.0")
        self.totalNC = Decimal("0.0")
        self.devoluciones = []
        self.consignacion = []
        
        self.init_grillaFactura()
        self.init_grillaFacturaPagos()
        self.init_grillaCtaCte()
        self.init_grillaCtaCtePagos()
        
        #PARA LAS CAJAS
        self.chequeaCajaCerrada()
        
        #para opciones desactivar en 1 o en 2
        print self.padre.inusuario.Value
        if self.padre.loginRol == "cajera":
            self.opcion.Show(True)
            self.opcion.Enable(True)
            
        else: 
            self.opcion.Show(False)
            self.opcion.Enable(False)
            
        self.refreshSussanClub()
        self.incodigo.SetFocus()
        
    def chequeaCajaCerrada(self):
        #pass
        
        sql = "SELECT cajacerrada FROM parametros WHERE sucursal=%s" % (self.sucursal)
        resultado = consultasBD.ordenCrudaDict(sql)
        fechacierreultimacaja = resultado[0]['cajacerrada']
        print "Fecha cierre ultima caja: ",fechacierreultimacaja
        print "Fecha del sistema: ",self.padre.fecha
        utiles.logOperaciones("Ventas.py: chequearCajaCerrada()")
        utiles.logOperaciones("Fecha cierre ultima caja: "+str(fechacierreultimacaja))
        utiles.logOperaciones("Fecha del sistema: "+str(self.padre.fecha))
        
        if (self.padre.fecha == fechacierreultimacaja):
            dlg = Mensaje.Mensaje(self,"No esta cerrada la CAJA. Cierre la caja del dia anterior.")
            try:
                dlg.ShowModal()
                self.Close() #cierra ventas.py
            finally:
                dlg.Destroy()   
        else:
            pass
            
# ***********************************************************************************
# INICIALIZANDO GRILLAS
# ***********************************************************************************

    def init_grillaFactura(self):
            
        columnas =['  PTC  ','Codigo','Descripcion','Talle','Color','Cant.','Unitario $','Sub-Total $','Desc. %','Total $','Modista']
        self.grid1.CreateGrid(30,len(columnas))
          
        for i,col in enumerate(columnas): 
            self.grid1.SetColLabelValue(i, col)
            
        self.grid1.AutoSizeColumn(0,True)
        self.grid1.AutoSizeRow(0,True)
        self.grid1.AutoSizeColumn(1,True)
        self.grid1.AutoSizeColumn(2,True)
        self.grid1.AutoSizeColumn(3,True)
        self.grid1.AutoSizeColumn(4,True)
        self.grid1.AutoSizeColumn(5,True)
        self.grid1.AutoSizeColumn(6,True)
        self.grid1.AutoSizeColumn(7,True)
        self.grid1.AutoSizeColumn(8,True)
        self.grid1.AutoSizeColumn(9,True)
        self.grid1.AutoSizeColumn(10,True)
        
        #self.grid1.SetColSize(0,95)
        #self.grid1.SetColSize(1,120)
        self.grid1.DisableDragColSize()
        self.grid1.DisableDragRowSize()
        self.total = "" 
        for x in xrange(30):
            for i in xrange(len(columnas)):
                if i not in (0,1,5,8,9,10):
                    self.grid1.SetReadOnly(x,i,True)

        return 1

    def init_grillaFacturaPagos(self):
        #Conf. GRilla nro. 2 de forma de pago
        cantidadRenglones = 4
        self.grid2.CreateGrid(cantidadRenglones,5)      
        columnas =['Forma','Descripcion','Cuotas','Valor Cuota','Total']
        for i in range(len(columnas)-1,-1,-1): 
            self.grid2.SetColLabelValue(i, columnas[i])
        self.grid2.AutoSizeColumn(0,True)
        self.grid2.AutoSizeColumn(1,True)
        self.grid2.AutoSizeColumn(2,True)
        self.grid2.AutoSizeColumn(3,True)
        self.grid2.SetColSize(1,100)
        self.grid2.DisableDragColSize()
        self.grid2.DisableDragRowSize()
        for x in xrange(cantidadRenglones):
            for i in xrange(5):
                if i not in (0,4):
                    self.grid2.SetReadOnly(x,i,True)
        return 1
        
    def init_grillaCtaCte(self):
        #configuro la grilla de cuentas corrientes
        #self.grid3.CreateGrid(len(resultados)+1,9)
        self.CtaCtePagos_detalle = [] #lista conteniendo los renglones que se pagan
        self.totalCuotas = { 1:Decimal("0.0"), 2:Decimal("0.0"), 3:Decimal("0.0"), 4:Decimal("0.0") } 
        self.totalAPagar = Decimal("0.0")
        columnas =['Vencimiento','Cuota.','Tipo','Nro.\nFactura','Monto','Cuota\nen $','Pagado','Saldo','Descripcion']
        self.grid3.CreateGrid(1,len(columnas))
        for i in range(len(columnas)-1,-1,-1): 
            self.grid3.SetColLabelValue(i, columnas[i])
        self.grid3.AutoSizeRow(0,True)
        self.grid3.AutoSizeColumn(0,True)
        self.grid3.AutoSizeColumn(1,True)
        self.grid3.AutoSizeColumn(2,True)
        self.grid3.AutoSizeColumn(3,True)
        self.grid3.AutoSizeColumn(4,True)
        self.grid3.AutoSizeColumn(5,True)
        self.grid3.AutoSizeColumn(6,True)
        self.grid3.AutoSizeColumn(7,True)
        self.grid3.DisableDragColSize()
        self.grid3.DisableDragRowSize()
        for col in xrange(7):
            self.grid3.SetReadOnly(0, col, True)
        
        self.checkConsultaCompleta.SetValue(False)
        self.textDesde.Enable(False)
        self.fechaDesde.Enable(False)
        self.checkRangoFechas.SetValue(False)
        self.textRangoDesde.Enable(False)
        self.textRangoHasta.Enable(False)
        self.checkVencido.SetValue(False)
        self.textVencido.SetLabel("0.00")
        self.checkRecargo.SetValue(False)
        self.textRecargo.SetLabel("0.00")
        self.checkEnFecha.SetValue(False)
        self.textEnFecha.SetLabel("0.00")
        self.checkFuturo.SetValue(False)
        self.textFuturo.SetLabel("0.00")
        self.checkRecargo.SetValue(False)
        self.textRecargo.SetLabel("0.00")
        self.checkTotal.SetValue(False)
        self.textDeuda.SetLabel("0.00")
        self.textMontoAPagar.SetValue("0.00")
        self.textMontoVaPagando.ChangeValue("0.00")
        from utiles import getDaysExtreme
        primerDia = getDaysExtreme()[0]
        ultimoDia = getDaysExtreme()[1]
        utiles.cargar_fecha(primerDia, self.rangoFechaDesde)
        utiles.cargar_fecha(ultimoDia, self.rangoFechaHasta)
        utiles.cargar_fecha(primerDia, self.fechaDesde)

    def init_grillaCtaCtePagos(self):
        cantidadRenglones = 4
        self.grid4.CreateGrid(cantidadRenglones,5)
        columnas =['Forma','Descripcion','Cuotas','Valor Cuota','Total']
        for i in range(len(columnas)-1,-1,-1): 
            self.grid4.SetColLabelValue(i, columnas[i])
        self.grid4.AutoSizeColumn(0,True)
        self.grid4.AutoSizeColumn(1,True)
        self.grid4.AutoSizeColumn(2,True)
        self.grid4.AutoSizeColumn(3,True)
        self.grid4.SetColSize(1,100)
        self.grid4.DisableDragColSize()
        self.grid4.DisableDragRowSize()
        for x in xrange(cantidadRenglones):
            for i in xrange(5):
                if i not in (0,4):
                    self.grid4.SetReadOnly(x,i,True)
        return 1

# ***********************************************************************************

    def llenarCtaCte(self, resultados):
        if self.incodigo.GetLabel()=="1-2":
            self.grid3.Enable(False)
            self.grid4.Enable(False)
            self.botonPagar.Enable(False)
            self.botonConsultar.Enable(False)
            self.button4.Enable(False)
            self.botonImprimir.Enable(False)
            return
        self.totalNC = Decimal("0.00")
        #informacion de saldo de migracion. Si es 0, no se mostrara nada
        consultaSQL = "SELECT saldoinicial FROM saldos WHERE idcliente = '%s'" % (self.incodigo.GetValue())
        resultado = consultasBD.ordenCrudaDict(consultaSQL)
        if len(resultado) > 0:
            saldoinicial = Decimal(str(resultado[0]['saldoinicial']))
            if saldoinicial != Decimal("0.00"):
                self.textSaldoInicial.ChangeValue(str(saldoinicial))
                self.saldoinicial.Show(True)
                self.textSaldoInicial.Show(True)
                self.button3.Show(True)
            else:
                self.textSaldoInicial.ChangeValue("0.00")
                self.saldoinicial.Show(False)
                self.textSaldoInicial.Show(False)
                self.button3.Show(False)
        
        #resultados es una tupla conteniendo diccionarios, uno por cada registro encontrado en la BD
        self.limpiarCtaCte() #se limpia la grilla 3, cuentas corrientes
        fechaActual = utiles.getfechaInverse()
        saldo = Decimal("0.0")
        print resultados
        if resultados != None:
            linea = 0
            for fil in xrange(len(resultados)):
                registro = resultados[fil]
                fecha = str(registro['vencimiento'])
                aux = fecha[-2:]+"-"+fecha[5:7]+"-"+fecha[0:4]
                self.grid3.SetCellValue(linea,0,aux)
                aux = str(registro['descripcion'])
                self.grid3.SetCellValue(linea,8,aux)
                aux = str(registro['cuota'])
                self.grid3.SetCellValue(linea,1,aux)
                aux = str(registro['idformapagos'])
                self.grid3.SetCellValue(linea,2,aux)
                aux = str(registro['nrofactura'])
                self.grid3.SetCellValue(linea,3,aux)
                aux = str(registro['montocuota'])
                saldo += Decimal(aux) #incrementa deuda
                aux = str(Decimal(aux).quantize(Decimal('0.10')))
                self.grid3.SetCellValue(linea,5,aux)
                aux = str(registro['montopagado'])
                saldo -= Decimal(aux) #disminuye deuda
                aux = str(Decimal(aux).quantize(Decimal('0.10')))
                self.grid3.SetCellValue(linea,6,aux)
                if registro['idrecargo'] != "-1":
                    aux = str(registro['nrofactura'])
                    consultaSQL = "SELECT totalfactura FROM ventas WHERE nrofactura = '%s' AND idventa = '%s'" % (aux,registro['idventa'])
                    resultado = consultasBD.ordenCrudaDict(consultaSQL)
                    aux = "0.00"
                    if resultado != ():
                        aux = str(resultado[0]['totalfactura'])
                else:
                    self.totalNC += Decimal(str(registro['montocuota'])) - Decimal(str(registro['montopagado']))
                    aux = ""
                self.grid3.SetCellValue(linea,4,aux)
                aux = str(saldo)
                aux = str(Decimal(aux).quantize(Decimal('0.10')))
                self.grid3.SetCellValue(linea,7,aux)
                self.textDeuda.SetLabel(aux)
                aux = str(registro['montocuota']-registro['montopagado'])
                color = BLANCO
                noPagado = ( (registro['montocuota']-registro['montopagado']) != 0 )
                if noPagado:
                    if registro['idrecargo'] != "-1":
                        if fecha == fechaActual:
                            self.totalCuotas[2] += Decimal(aux)
                            color = VERDE
                        elif fecha < fechaActual:
                            self.totalCuotas[1] += Decimal(aux)
                            color = ROJO

                        if color != BLANCO:
                            self.CtaCtePagos_detalle.append(linea)
                            for i in xrange(self.grid3.GetNumberCols()):
                               self.grid3.SetCellBackgroundColour(linea, i, color)
                
                for i in xrange(self.grid3.GetNumberCols()):
                    self.grid3.SetReadOnly(linea, i, True)
                if fil != len(resultados)-1: # len(resultado)-1
                    self.grid3.AppendRows(1)
                    linea +=1
                    #si hay recargos, se incluyen tambien en la visualizacion
                    idrecargo = registro['idrecargo']
                    if idrecargo == "-1": continue
                    # while idrecargo != None:
                    #    tablaSQL    = "vtas_recargos"
                    #    camposSQL   = "idrecargo,idrecibo,fecharecargo,monto,montopagado,descripcion,idrecargo2"
                    #    consultaSQL = "SELECT "+camposSQL+" FROM "+tablaSQL+" WHERE idrecargo = '"+idrecargo+"'"
                    #    resultado = consultasBD.ordenCrudaDict(consultaSQL)
                    #    print "result:"+str(resultado)

                    #    if resultado == None:
                    #        #error: aqui deberia haber un registro
                   #        print "salio por aca"+str(resultado)
                    #        print "error"
                    #        idrecargo = None
                    #    else:
                    #        registro = resultado[0]
                    #        if (registro['idrecibo'] == None) or (registro['idrecibo'] >= "0"):
                    #            #muestro la info en pantalla
                    #            if (registro['monto'] == registro['montopagado']) and not self.checkConsultaCompleta.GetValue():
                    #                idrecargo = registro['idrecargo2']
                    #                continue
                    #            fecha = str(registro['fecharecargo'])
                    #            aux = fecha[-2:]+"-"+fecha[5:7]+"-"+fecha[0:4]
                    #            self.grid3.SetCellValue(linea,0,aux)
                    #            aux = str(registro['descripcion'])+" / "+str(registro['idrecargo'])
                    #            self.grid3.SetCellValue(linea,1,aux)
                    #            aux = ""
                    #            self.grid3.SetCellValue(linea,2,aux)
                    #            aux = ""
                    #            self.grid3.SetCellValue(linea,3,aux)
                    #            aux = ""
                    #            self.grid3.SetCellValue(linea,4,aux)
                    #            aux = str(registro['monto'])
                    #            saldo += Decimal(aux) #incrementa deuda
                    #            aux = str(Decimal(aux).quantize(Decimal('0.10')))
                    #            self.grid3.SetCellValue(linea,5,aux)
                    #            aux = str(registro['montopagado'])
                    #            saldo -= Decimal(aux) #disminuye deuda
                    #            aux = str(Decimal(aux).quantize(Decimal('0.10')))
                     #           self.grid3.SetCellValue(linea,6,aux)
                     #           aux = str(saldo)
                     #           aux = str(Decimal(aux).quantize(Decimal('0.10')))
                     #           self.grid3.SetCellValue(linea,7,aux)
                     #           self.textDeuda.SetLabel(aux)
                     #           aux = str(registro['monto']-registro['montopagado'])
                     #           self.totalCuotas[4] += Decimal(aux)

                    #            elf.CtaCtePagos_detalle.append(linea)
                    #           for i in xrange(self.grid3.GetNumberCols()):
                    #               self.grid3.SetCellBackgroundColour(linea, i, AMARILLO)
                    #            
                    #            for i in xrange(self.grid3.GetNumberCols()):
                    #                self.grid3.SetReadOnly(linea, i, True)
                    #            self.grid3.AppendRows(1)
                    #            linea += 1
                            
                    #        idrecargo = registro['idrecargo2'] 

        for col in xrange(self.grid3.GetNumberCols()):
            self.grid3.AutoSizeColumn(col,True)

        aux = str(self.totalCuotas[1]) #vencido
        aux = str(Decimal(aux).quantize(Decimal('0.10')))
        self.textVencido.SetLabel(aux)

        aux = str(self.totalCuotas[2]) #al dia
        aux = str(Decimal(aux).quantize(Decimal('0.10')))
        self.textEnFecha.SetLabel(aux)

        aux = str(self.totalCuotas[3]) #futuro
        aux = str(Decimal(aux).quantize(Decimal('0.10')))
        self.textFuturo.SetLabel(aux)

        self.textRecargo.SetLabel("")
        #aux = str(self.totalCuotas[4]) #recargo
        #aux = str(Decimal(aux).quantize(Decimal('0.10')))
        #self.textRecargo.SetLabel(aux)

        self.calcularTotalAPagar()

# ***********************************************************************************

    def limpiarCtaCte(self):
        #se limpia la informacion de la grilla de cuenta corriente
        renglones = self.grid3.GetNumberRows()
        if renglones > 1:
            for fila in xrange(renglones-1):
                self.grid3.DeleteRows(1)
        for i in xrange(self.grid3.GetNumberCols()):
           self.grid3.SetCellBackgroundColour(0, i, BLANCO)
        self.grid3.ClearGrid()
        self.CtaCtePagos_detalle = []
        self.totalCuotas = { 1:Decimal("0.00"), 2:Decimal("0.00"), 3:Decimal("0.00"), 4:Decimal("0.00") }
        self.totalAPagar = Decimal("0.00")

    def limpiarCtaCtePagos(self):
        #se limpia la informacion de la grilla de cuenta corriente
        renglones = self.grid4.GetNumberRows()
        self.grid4.ClearGrid()
        self.textMontoAPagar.SetLabel("0.00")
        self.textMontoVaPagando.SetLabel("0.00")
        self.checkVencido.SetValue(False)
        self.checkRecargo.SetValue(False)
        self.checkEnFecha.SetValue(False)
        self.checkFuturo.SetValue(False)
        self.checkTotal.SetValue(False)
        self.textSaldoInicial.ChangeValue("0.00")
        self.saldoinicial.Show(False)
        self.textSaldoInicial.Show(False)
        self.button3.Show(False)
        

# ***********************************************************************************

    def OnBotonLimpiar(self, event):
        self.incodigo.ChangeValue("")
        self.inapellido.ChangeValue("")
        self.indireccion.ChangeValue("")
        self.intelefono.ChangeValue("")
        self.inemail.ChangeValue("")
        self.incumple.ChangeValue("")
        self.inacumulados.ChangeValue("")
        self.inSituacionFiscal.ChangeValue("")
        self.textCtrl1.SetLabel("")
        self.c_incodigo.ChangeValue("")
        self.c_inapellido.ChangeValue("")
        self.c_indireccion.ChangeValue("")
        self.c_intelefono.ChangeValue("")
        self.c_inemail.ChangeValue("")
        self.c_incumple.ChangeValue("")
        self.c_inacumulados.ChangeValue("")
        self.c_textCtrl6.ChangeValue("")
        self.limpiarCtaCte() #se limpia la grilla 3, cuentas corrientes
        self.limpiarCtaCtePagos()
        self.checkConsultaCompleta.SetValue(False)
        self.textDesde.Enable(False)
        self.fechaDesde.Enable(False)
        self.checkRangoFechas.SetValue(False)
        self.textRangoDesde.Enable(False)
        self.textRangoHasta.Enable(False)
        self.textVencido.SetLabel("0.00")
        self.textEnFecha.SetLabel("0.00")
        self.textFuturo.SetLabel("0.00")
        self.textRecargo.SetLabel("0.00")
        self.checkVencido.SetValue(False)
        self.checkEnFecha.SetValue(False)
        self.checkFuturo.SetValue(False)
        self.checkRecargo.SetValue(False)
        self.textMontoAPagar.SetValue("0.00")
        self.clubTxt.SetValue('')
        
        from utiles import getDaysExtreme
        primerDia = getDaysExtreme()[0]
        ultimoDia = getDaysExtreme()[1]
        utiles.cargar_fecha(primerDia, self.rangoFechaDesde)
        utiles.cargar_fecha(ultimoDia, self.rangoFechaHasta)
        utiles.cargar_fecha(primerDia, self.fechaDesde)
        self.innrofactura.ChangeValue("")
        self.haycliente = 0

# ***********************************************************************************

    def __llenandoDatosCliente(self,resultado):
        self.incodigo.ChangeValue(resultado['idcliente'])
        self.c_incodigo.ChangeValue(resultado['idcliente'])
        self.inapellido.ChangeValue(resultado['nombre'])
        self.c_inapellido.ChangeValue(resultado['nombre'])
        self.indireccion.ChangeValue(resultado['direccion'])
        self.c_indireccion.ChangeValue(resultado['direccion'])
        self.intelefono.ChangeValue(resultado['telefono'])
        self.c_intelefono.ChangeValue(resultado['telefono'])
        if str(resultado['listanegra'])=="1":
            self.inemail.SetBackgroundColour(ROJO)
        self.inemail.ChangeValue(resultado['email'])
        self.c_inemail.ChangeValue(resultado['email'])
        self.incumple.ChangeValue(resultado['cumple'])
        self.c_incumple.ChangeValue(resultado['cumple'])
        self.inacumulados.ChangeValue(str(resultado['acumulados']))
        self.c_inacumulados.ChangeValue(str(resultado['acumulados']))
        self.inSituacionFiscal.ChangeValue(resultado['situacionfiscal'])
        self.c_textCtrl6.ChangeValue(resultado['situacionfiscal'])
        self.clubTxt.ChangeValue(resultado['tarjetasussan'])
        self.haycliente = 1
        self.ponerNumeroComprobante()

        id = self.incodigo.GetValue()
        resultado = CtasCtes.infoClientes(id,"and montocuota <> montopagado","")
        self.llenarCtaCte(resultado[1])

    def OnBuscaxapellidoButton(self,event):
        ventana= Buscaclientes.Buscaclientes(self)
        ventana.hacebusquedanombre(self.inapellido.Value,str(self.incodigo.Value),\
                                   self.indireccion.Value,self.intelefono.Value,\
                                   self.inemail.Value,self.textCtrl1.Value,\
                                   self.clubTxt.Value)
        try:
            if ventana.getHallado() == 0:
                ventana.ShowModal()
            id = ventana.Muestraid()
            resultado = CtasCtes.infoClientes(id,"and montocuota <> montopagado","")
            for r in resultado[0]:
                self.incodigo.ChangeValue(str(id))
                self.inapellido.ChangeValue(str(r[1]))
                self.indireccion.ChangeValue(str(r[2]))
                self.intelefono.ChangeValue(str(r[5]))
                self.inemail.ChangeValue(str(r[7]))
                self.incumple.ChangeValue(str(r[8]))
                self.inacumulados.ChangeValue(str(r[9]))
                self.inSituacionFiscal.ChangeValue(str(r[10])) #condicion IVA
                self.textCtrl1.SetLabel(str(r[12]))
                self.c_incodigo.ChangeValue(str(id))
                self.c_inapellido.ChangeValue(str(r[1]))
                self.c_indireccion.ChangeValue(str(r[2]))
                self.c_intelefono.ChangeValue(str(r[5]))
                self.c_inemail.ChangeValue(str(r[7]))
                self.c_incumple.ChangeValue(str(r[8]))
                self.c_inacumulados.ChangeValue(str(r[9]))
                self.c_textCtrl6.ChangeValue(str(r[10])) #condicion IVA
                self.clubTxt.ChangeValue(str(r[18]))
                self.llenarCtaCte(resultado[1])
                self.haycliente = 1
                self.ponerNumeroComprobante()
        finally:
            ventana.Destroy()

    def OnBotonnuevoclienteButton(self, event):
        ventana = ABMclientes.ABMclientes(self)
        try:
            ventana.ShowModal()
            idcliente = ventana.Muestraid()
            if idcliente != "":
                #busca el cliente nuevo con el nuevo ID
                consultaSQL = "SELECT * FROM cliente WHERE idcliente = '"+idcliente+"'"
                resultado = consultasBD.ordenCrudaDict(consultaSQL)
                if len(resultado) != 0:
                    resultado = resultado[0]
                    self.OnBotonLimpiar(None)
                    self.__llenandoDatosCliente(resultado)
        finally:
            ventana.Destroy()

    def OnButton2Actualizar(self, event):
        #actualiza los datos del cliente con el id del mismo
        tablaSQL = "cliente"
        camposSQL = " nombre = '%s', direccion = '%s',telefono = '%s', email = '%s', cumple = '%s'" % (str(self.inapellido.Value),str(self.indireccion.Value),str(self.intelefono.Value),str(self.inemail.Value),str(self.incumple.Value))
        condicionSQL = "idcliente= '%s'" % (self.incodigo.Value) 
        consultasBD.executaUpdateSQL(self,tablaSQL,camposSQL,condicionSQL)
        utiles.mensaje(None,"Se actualizaron los datos del cliente")
        sincronizar_tabla.addChange(sql=sql)
        
    def OnComboVendedoraCombobox(self, event):
        print "Obteniendo datos de vendedoras"
        SQL = "SELECT * FROM vendedoras WHERE nombre='%s'" % (self.comboVendedora.GetValue())
        resultado = consultasBD.ordenCrudaResultDict(SQL)
        self.invendedora.ChangeValue(str(resultado["idvendedora"]))

    def cargarComboVendedora(self):
        #sucursal = utiles.getSucursalActiva()
        self.comboVendedora.Clear()
        self.comboVendedora.SetLabel("Vendedoras...")
        sucursal = self.txtCodigoSucursal.GetLabel()
        SQL = "SELECT * FROM vendedoras WHERE sucursal='%s'" % (sucursal)
        resultado = consultasBD.ordenCrudaDict(SQL)
        for item in resultado:
            self.comboVendedora.Append(item["nombre"])

    def cargarSucursalVendedora(self):
        sucursal = utiles.getSucursalActiva()
        SQL = "SELECT nombre FROM sucursales WHERE codsucursal='%s'" % (sucursal)
        resultado = consultasBD.ordenCrudaDict(SQL)
        self.sucuVendedora.SetLabel(resultado[0]["nombre"])
        self.txtCodigoSucursal.SetLabel(sucursal)
        SQL = "SELECT nombre FROM sucursales"
        resultado = consultasBD.ordenCrudaDict(SQL)
        for item in resultado:
            self.sucuVendedora.Append(item["nombre"])
        
    def OnSucuVendedoraCombobox(self, event):
        print "Obteniendo datos de sucursal"
        nombre = self.sucuVendedora.GetValue()
        SQL = "SELECT codsucursal FROM sucursales WHERE nombre='%s'" % (nombre)
        resultado = consultasBD.ordenCrudaDict(SQL)
        self.txtCodigoSucursal.SetLabel(resultado[0]["codsucursal"])
        self.comboVendedora.SetLabel("Vendedoras...")
        self.invendedora.SetValue("")
        self.cargarComboVendedora()
        
# **************************************************************

    def OnInconsignacionCheckbox(self, event):
        if self.inconsignacion.GetValue():
            #entregado en consignacion, no se necesita visualizar otros datos
            self.staticText1.Show(False)
            self.grid2.Show(False)
            self.opcion.Show(False)
            self.staticText6.Show(False)
            self.inpagando.Show(False)
            self.facturacion.SetLabel("Consignacion")
        else:
            self.staticText1.Show(True)
            self.grid2.Show(True)
            self.opcion.Show(True)
            self.staticText6.Show(True)
            self.inpagando.Show(True)
            self.facturacion.SetLabel("Facturacion")
        self.ponerNumeroComprobante()
    
# ***********************************************************************************
    
    def OnGrid1CambiaGrilla(self, event): 
        #detecta un cambio en la grilla
        #la tabla producto:
        # idproducto,codproveedor,codbarras,idproveedor,idsucursal,descri,preciolt1,preciolt2,preciolt3,preciocompra,idtemporada,talle,anio,color,stock
        #verifico que se pueda borrar todo menos el descuento
        
        fil = self.grid1.GetGridCursorRow()
        col = self.grid1.GetGridCursorCol()
        if self.grid1.GetCellValue(fil,col).upper()=="VARIOS":
            texto = "Se ha inhabilitado el codigo VARIOS.\n"
            texto+= "Debe utilizar el codigo del producto.\nVea la etiqueta."
            utiles.mensaje(None,texto)
            self.grid1.SetCellValue(fil,col,"")
            return
        
        #limpia el renglon
        if (self.grid1.GetCellValue(fil,0) == ""):
            self.grid1.SetCellValue(fil,col,"")
            for columna in xrange(self.grid1.GetNumberCols()):
                self.grid1.SetCellValue(fil,columna,"")
            self.actualizaSubtotal()
            self.grid1.ForceRefresh()
            return
        
        filas = 0
        if (col == 5) and (self.grid1.GetCellValue(fil,1) != ""):
            # estoy cambiando la cantidad y hay un codigo cargado
            if not utiles.isDecimal(self.grid1.GetCellValue(fil,5)):
                utiles.mensaje(None,"La cantidad debe ser un valor numerico")
                self.grid1.SetCellValue(fil,5,"1.00")
                return 
            cantidad = Decimal(self.grid1.GetCellValue(fil,5))
            self.grid1.SetCellValue(fil,5,"%0.02f" % cantidad)

            #verifico que hay stock
            if (cantidad == Decimal("0.00")):
                utiles.mensaje(None,"La cantidad no puede ser cero (0)")
                self.grid1.SetCellValue(fil,5,"1.00")
                return 
            ptc = self.grid1.GetCellValue(fil,0)
            if cantidad > Decimal("0.00"):
                if (utiles.verificoStock(cantidad,ptc,self.padre.sucursalNro)):
                    #modificacion del stock en la grilla
                    self.actualizaSubtotal()
                else:
                    utiles.mensaje(None,"No hay STOCK suficiente")
                    self.grid1.SetCellValue(fil,5,"1.00")
            else: #cantidad < 0 significa que se trata de una devolucion
                self.actualizaSubtotal()
            self.grid1.ForceRefresh()
            return

        elif col == 8: 
        #ingreso un descuento, verificandose primero si no hay un descuento general aplicado
            if self.indesc.GetValue() != "0.00":
                utiles.mensaje(None,"No puede ingresar un descuento por item\nhabiendo un descuento general")
                self.grid1.SetCellValue(fil,8,"")
                self.grid1.Refresh
                return
            if not utiles.isDecimal(self.grid1.GetCellValue(fil,8)):
                utiles.mensaje(None,"El descuento del item debe ser un valor numerico")
                self.grid1.SetCellValue(fil,8,"0.00")
                self.grid1.Refresh
                self.actualizaSubtotal()
                return 

            if Decimal(self.grid1.GetCellValue(fil,8)) < Decimal("0.00"):
                utiles.mensaje(None,"El descuento debe ser un valor positivo")
                self.grid1.SetCellValue(fil,8,"0.00")
                self.grid1.Refresh
                return 

            aux1 = "%.02f" % Decimal(self.grid1.GetCellValue(fil,8))
            aux2 = aux1.split(".")
            parteEntera = Decimal(aux2[0])
            parteDecimal = Decimal(aux2[1])
            if parteEntera > Decimal("99"):
                utiles.mensaje(None,"Forma X numerica no valida para Descuento\nA lo sumo debe ser 2 enteros con 2 decimales")
                self.grid1.SetCellValue(fil,8,"0.00")
                self.grid1.Refresh
                self.actualizaSubtotal()
                return 
            if parteDecimal > Decimal("99"):
                utiles.mensaje(None,"Forma X numerica no valida para Descuento\nA lo sumo debe ser 2 enteros con 2 decimales")
                self.grid1.SetCellValue(fil,8,"0.00")
                self.grid1.Refresh
                self.actualizaSubtotal()
                return 
            self.grid1.SetCellValue(fil,8,aux1)
            self.actualizaSubtotal()
            self.grid1.ForceRefresh()

        elif col == 9:
            #estoy cargando un precio final y el sistema debe verificar el descuento que corresponde
            #primero verifico que no haya un descuento general aplicado
            if self.indesc.GetValue() != "0.00":
                utiles.mensaje(None,"No puede hacer un descuento por item\nhabiendo un descuento general")
                self.grid1.SetCellValue(fil,9,"")
                self.actualizaSubtotal()
                self.grid1.Refresh
                return
            if not utiles.isDecimal(self.grid1.GetCellValue(fil,9)):
                utiles.mensaje(None,"El total del item debe ser un valor numerico")
                self.grid1.SetCellValue(fil,9,"")
                self.actualizaSubtotal()
                self.grid1.Refresh
                return 

            if Decimal(self.grid1.GetCellValue(fil,9)) <= Decimal("0.00"):
                utiles.mensaje(None,"El total debe ser un valor positivo mayor a cero")
                self.grid1.SetCellValue(fil,9,"")
                self.actualizaSubtotal()
                self.grid1.Refresh
                return 

            # calculo del descuento => (f - p) * 100 / (-1 * p) = d

            p = Decimal(self.grid1.GetCellValue(fil,7))
            f = Decimal(self.grid1.GetCellValue(fil,9))
            d = (f - p) * Decimal("100.00") / (Decimal("-1.00") * p)
            descuento = "%.02f" % d
            self.grid1.SetCellValue(fil,8,descuento)
            
            self.actualizaSubtotal()
            self.grid1.Refresh
                
        elif col == 10: 
            #ingreso un arreglo para la modista
            #variable para ver si carga un arreglo a la modista o no
            if self.invendedora.GetValue() == "":
                utiles.mensaje(self,"Debe seleccionar el nombre de la vendedora")
                self.grid1.SetCellValue(fil,10,"")
                return
            self.cargaSioNo = 0
            #variable para pasar el cod. del producto al de la modista
            self.codpro = self.grid1.GetCellValue(fil,0)
            utiles.logOperaciones("Ventas.py: OnGrid1CambiaGrilla() -> procesando modista")
            modista = Modista.Dialog1(self)
            try:
                modista.ShowModal()
                utiles.logOperaciones("carga despues:"+str(self.cargaSioNo))
                if (int(self.cargaSioNo)==1):
                   #resta1 = int(self.grid1.GetGridCursorRow())-1
                   self.grid1.SetCellValue(fil,10,"Con Arreglo")
            finally:
                modista.Destroy()
            return
            
        else:
            #busca el producto por el cod. de barras
            ptc = self.grid1.GetCellValue(fil,0)
            if (self.grid1.GetCellValue(fil,0) == ""):
                utiles.mensaje(None,"Debe ingresar un codigo de producto (PTC)")
                self.grid1.SetCellValue(fil,1,"")
                return
            SQL = "SELECT * FROM productos a, producto_talle_color b, stock c WHERE a.codsussan = b.codsussan AND c.ptc ='%s' AND b.id=c.ptc and c.sucursal=%s" % (ptc,self.padre.sucursalNro)
            resultado = consultasBD.ordenCrudaResultDict(SQL)
            #busco si el producto ya fue ingresado en la grilla
            if len(resultado) <= 0:
                utiles.mensaje(None,"No existe el codigo ingresado para esta sucursal")
                return
            #'Codigo','Descripcion','Talle','Color','Cantidad','Unitario $','Sub-Total $','Desc. %','Total $'
            
            if not (utiles.verificoStock(1,ptc,self.padre.sucursalNro)):
                utiles.mensaje(None,"No hay STOCK para la cantidad ingresada.")
                self.grid1.SetCellValue(fil,5,"1.00")
                return

            for x in xrange(self.grid1.GetNumberRows()):
                #asigna el mismo producto a la fila del producto ya ingresado
                #verifico que ya este cargado en la grilla
                if (self.grid1.GetCellValue(x,0) == resultado["ptc"] and self.grid1.GetCellValue(x,1)==resultado["codsussan"] ): 
                    cantidad = Decimal(self.grid1.GetCellValue(x,5)) + Decimal("1.00")
                    self.grid1.SetCellValue(x, 5, str("%0.02f" % cantidad))
                    self.grid1.SetCellValue(fil,0,"")
                    self.grid1.ForceRefresh()
                    self.actualizaSubtotal()
                    self.grid1.ForceRefresh()
                    break
                else:
                    #self.grid1.SetCellValue(fil, 0, str(resultado["codsussan"])) #descri
                    self.grid1.SetCellValue(fil, 1, str(resultado["codsussan"])) #descri
                    self.grid1.SetCellValue(fil, 2, str(resultado["descri"])) #descri
                    self.grid1.SetCellValue(fil, 3, resultado["talle"]) #talle
                    self.grid1.SetCellValue(fil, 4, resultado["color"]) #color
                    self.grid1.SetCellValue(fil, 5, str("1.00")) #cantidad
                    self.grid1.SetCellValue(fil, 6, str("%0.02f" % resultado["preciolt1"])) #P. Unitario
                    self.grid1.SetCellValue(fil, 7, str("%0.02f" % resultado["preciolt1"])) #Subtotal
                    self.grid1.SetCellValue(fil, 8, str("0.00"))           #descuento
                    self.grid1.SetCellValue(fil, 9, str("%0.02f" % resultado["preciolt1"])) #Total
                    self.actualizaSubtotal()
                    self.grid1.ForceRefresh()
                    break
                        
    def actualizaSubtotal(self):
        self.grid1.ForceRefresh()
        descuento = Decimal("0.00")
        unidades = Decimal("0.00")
        preciounitario = Decimal("0.00")
        
        for fila in xrange(self.grid1.GetNumberRows()):
            if (self.grid1.GetCellValue(fila,0) == ""):
                continue
            if utiles.isDecimal(str(self.grid1.GetCellValue(fila,8))):
                descuento = Decimal(str(self.grid1.GetCellValue(fila,8)))

            unidades = Decimal(str(self.grid1.GetCellValue(fila,5)))
            preciounitario = Decimal(str(self.grid1.GetCellValue(fila,6)))
            subtotalitem = preciounitario * unidades
            self.grid1.SetCellValue(fila,7,str("%0.02f" % subtotalitem))

            itemcondescuento = (subtotalitem - ((descuento * subtotalitem) / Decimal("100.00")))
            self.grid1.SetCellValue(fila,9,str("%0.02f" % itemcondescuento))
                
        self.grid1.ForceRefresh() 
        #saco el TOTAL
        self.totalfactura()
    
    def totalfactura(self):
        subtotal = Decimal("0.00")
        for fil in xrange(self.grid1.GetNumberRows()):
            tomocelda = str(self.grid1.GetCellValue(fil,9))
            if tomocelda != "" :
                subtotal = subtotal + Decimal(tomocelda)
        
        #descuento
        descuento = str(self.indesc.GetValue())
        if utiles.isDecimal(descuento):
            descuento = Decimal(subtotal * Decimal(descuento) / Decimal("100.00"))
            subtotal -= descuento
            
        #recargo
        recargo = str(self.inrecargo.GetValue())
        if utiles.isDecimal(recargo):
            recargo = Decimal(subtotal * Decimal(recargo) / Decimal("100.00"))
            subtotal += recargo    
            

        #discrimina al iva
        totalSinIVA = subtotal / Decimal("1.21")
        iva = subtotal - totalSinIVA
        self.iva.ChangeValue("%0.02f" % (round(iva,2)))
        self.intotal.ChangeValue("%0.02f" % (round(subtotal,2)))
        self.ivadiscriminado.ChangeValue("%0.02f" % (round(totalSinIVA,2)))
        
        self.total = self.intotal.Value
        
        self.valores['resto']=subtotal
        self.valores['total']=subtotal       
        self.grid1.ForceRefresh()

#empieza el trabajo de GUARDAR LA VENTA
    
# **************************************************************

    def OnFacturacionButton(self, event):
        cantidadNegativa = False
        cantidadPositiva = False
        #verifica facturacion $1000 o mayor a clientes
        totalFacturado = self.intotal.GetLabel()
        try:
            totalFacturado = Decimal(totalFacturado).quantize(Decimal("0.10"))
        except:
            totalFacturado = Decimal("0.00")
        idcliente = self.incodigo.GetLabel()
        tipo = self.opcion.Selection
        if idcliente=="1-2" and totalFacturado>Decimal("1000.00") and tipo==0:
            texto = "Por disposicion de la AFIP, deben identificarse\n"
            texto+= "los clientes que compran por mas de $1000.00.\n"
            texto+= "Proceda a dar de alta al cliente antes de facturar."
            utiles.mensaje(None,texto)
            return
        
        for renglon in xrange(self.grid1.GetNumberRows()):
            if utiles.isDecimal(self.grid1.GetCellValue(renglon,5)):
                if Decimal(self.grid1.GetCellValue(renglon,5)) > Decimal("0.00"):
                    cantidadPositiva = True
                    continue
                if Decimal(self.grid1.GetCellValue(renglon,5)) < Decimal("0.00"):
                    cantidadNegativa = True
##        if cantidadNegativa and cantidadPositiva:
##            texto = "ATENCION: NO PUEDE MEZCLAR Cantidad NEGATIVA\n Y POSITIVA EN EL MISMO DOCUMENTO."
##            utiles.mensaje(None,texto)
##            texto = "Si desea hacer devoluciones, seleccione el boton\ncorrespondiente. "
##            texto+= "Luego proceda a facturar el/los item/s"
##            utiles.mensaje(None,texto)
##            return 0
        
        #determina el tipo de operacion
        if self.inconsignacion.GetValue():
            tipoOperacion = 999 # consignacion
            utiles.logOperaciones("Ventas.py: OnFacturacionButton() Consignacion")
        elif (self.opcion.Selection == 0):
            tipoOperacion = 1
            utiles.logOperaciones("Ventas.py: OnFacturacionButton() Tipo 1")
        else:
            tipoOperacion = 2
            utiles.logOperaciones("Ventas.py: OnFacturacionButton() Tipo 2")

        if self.intotal.Value == "": self.intotal.ChangeValue("0.00")
        a = Decimal(self.intotal.Value)
        if self.inpagando.Value == "": self.inpagando.ChangeValue("0.00")
        b = Decimal(self.inpagando.Value)
        
        #verifica igualdad entre total valores de la mercaderia entregada y los valores entregados como pago
        if (a != b) and (tipoOperacion != 999) and (self.devoluciones == []):
            texto  = "No coincide el TOTAL de la factura\n"
            texto += "con el TOTAL de valores por la compra."
            utiles.mensaje(self,texto)
            return 0

        if (a == Decimal("0.00")):
            texto  = "Falta informacion para la emision del comprobante"
            utiles.mensaje(self,texto)
            return 0
        
        if self.invendedora.GetValue() == "":
            utiles.mensaje(self,"Debe seleccionar el nombre de la vendedora")
            return 0
        if not self.hayclientecargado(): return 0

        self.facturacion.SetLabel('PROCESANDO')
        self.facturacion.Enable(False)
        
        #a es el total de la factura y si es mayor a 0, significa que es una venta y hay que imprimir ticket
        if a > Decimal("0.00"):
            utiles.logOperaciones("IMPRESION DE TICKET")
            try:
                imprimio = self.imprimeTICKETFISCAL(tipoOperacion)
            except ImpresionFiscal.PrintError:
                utiles.logOperaciones("ERROR: en impresion ticket - problema de impresora")
                utiles.mensaje(self, "No ha podido imprimirse el comprobante\nProblemas con la impresora fiscal?")
            except Exception, e:
                utiles.logOperaciones("ERROR: en impresion ticket - problema de sistema")
                utiles.logOperaciones("ERROR: "+e.__str__())
                print e.__str__()

        listaDetalleCuotas = []
        utiles.logOperaciones("procesando la venta, guardando la informacion en la BD")

        try:
            consultasBD.begin()
            self.idventa = self.GuardaProductosVendidos(tipoOperacion) #actualiza archivos ventas_ y tabla parametros
            self.darBajaProductos(self.idventa, self.padre.sucursalNro,self.listaproductos,tipoOperacion)
            listaDetalleCuotas = self.ProcesarValoresRecibidos(tipoOperacion) #procesa los pagos
            nuevoacumulado = CtasCtes.actualizarAcumulados(self.incodigo.GetValue(),self.inacumulados.GetValue(),self.intotal.GetValue())
            self.inacumulados.SetValue(str(nuevoacumulado))

            if self.devoluciones != []:
                nronotacredito,idcliente = Facturacion.procesarDevoluciones(self.devoluciones,self.sucursal,self.clienteRegalo)
                imprimio=False
                #LLAMA A LA IMPRESION DE LA N.C FISCAL
                #imprimio = ImpresionFiscal.NotaCreditoFiscal(self.devoluciones,self.sucursal,self.grid1,nronotacredito,idcliente)
                try:
                    imprimio = self.imprimeNOTACREDITOFISCAL(nronotacredito, tipoOperacion)
                except ImpresionFiscal.PrintError:
                    utiles.logOperaciones("ERROR: en impresion ticket - problema de impresora")
                    utiles.mensaje(self, "No ha podido imprimirse el comprobante\nProblemas con la impresora fiscal?")
                except Exception, e:
                    utiles.logOperaciones("ERROR: en impresion ticket - problema de sistema")
                    utiles.logOperaciones("ERROR: "+e.__str__())
                    print e.__str__()
                
            if self.consignacion != []:
                Facturacion.procesarFacturaConsignaciones(self.consignacion)
                
            if self.sussanClub:
                club_id = self.clubTxt.GetValue()
                club_id_clean = clubManager.clean_club_id(club_id)             
                clubManager.save_sell_points(club_id_clean, self.idventa, '')

            consultasBD.commit()
            #sincronizar_tabla.syncServerTables(self, ["stock", "cliente", "club", "club_puntos" ])
            if tipoOperacion != 999:
                utiles.mensaje(self, "La venta se guardo.")
            else:
                utiles.mensaje(self, "La operacion de consignacion finalizo correctamente")
        
        except sussanException.SussanException, e:
            utiles.mensaje(self, e.message)
            consultasBD.rollback()
            self.facturacion.SetLabel('Facturar')
            self.facturacion.Enable(True)            
            return
        except sincronizar_tabla.SyncError:
            utiles.logOperaciones("ERROR: no se sincronizo el stock")
            utiles.mensaje(self, "El stock se actualizo pero no termino de transmitirse.\nPor favor, realice un sincronizacion")
        except Exception, e:
            print e.__str__()
            utiles.logOperaciones("ERROR: no se pudo actualizar el stock")
            texto = "Ha ocurrido un problema en el sistema.\n"
            texto+= "Tome nota del numero de ticket para informar\n"
            texto+= "posteriormente al administrador del sistema\n"
            texto+= "para revision."
            utiles.mensaje(self, texto)
            self.facturacion.SetLabel('Facturar')
            self.facturacion.Enable(True)
            consultasBD.rollback()

        print listaDetalleCuotas
        
        #*************************************************
        #CONCURSO CRUCERO ********** IMPRESION CUPON SORTEO
        #if (float(self.intotal.GetValue()) > float(0.01)):
        #   print "ENTRO AL CONCURSO"
        #   concurso.nuevo(self,self.idcliente,self.padre.fecha,self.intotal.GetValue())
        
        if len(listaDetalleCuotas) > 1:
            texto = "Desea imprimir el detalle de las cuotas en\n"
            texto+= "Cuenta Corriente, montos y fechas de\n"
            texto+= "vencimientos?\n\n"
            texto+= "(Aceptar = si, Cancelar = No)"
            if not utiles.dialog2(self,texto): 
                self.Close()
                return

        try:
            if len(listaDetalleCuotas) > 1:
                utiles.logOperaciones("IMPRESION DE TICKET: Detalle de Cuenta Corriente")
                ImpresionFiscal.imprimirDetalle(listaDetalleCuotas)
            self.Close()
        except ImpresionFiscal.PrintError:
            utiles.logOperaciones("ERROR: en impresion ticket - problema de impresora")
            utiles.mensaje(self, "No ha podido imprimirse el detalle de cuotas\nProblemas con la impresora fiscal?")
            self.Close()
        except Exception, e:
            utiles.logOperaciones("ERROR: en impresion ticket - problema de sistema")
            print e.__str__()

        self.Close()
        
# **************************************************************

    def GuardaProductosVendidos(self, idformaticket):

        #el siguiente condicional actualiza la tabla de parametros segun el tipo de venta
        #si el ticket no logra imprimirse, aqui se producira un desfasaje entre el numero
        #en la impresora fiscal y el numero en la tabla parametros
        if idformaticket == 999:
            #consignacion
            utiles.guardarNumeroConsignacion(self.nrofactura, str(self.sucursal))
        elif idformaticket == 1:
            #venta 1
            if self.inSituacionFiscal.GetValue() == "Inscripto":
                utiles.guardarNumeroVentaA(self.nrofactura, str(self.sucursal))
            else:
                utiles.guardarNumeroVentaB(self.nrofactura, str(self.sucursal))
        else:
            #venta 2
            utiles.guardarNumeroVenta2(self.nrofactura, str(self.sucursal))

        #nrofactura,fecha,hora,idcliente,idlistaprecio,idformapago,turno,iddescuento,pagocon,vuelto,pagoen2
        #EN tabla VENTAS
        self.idventa = utiles.secuencia("ventas", self.sucursal)
        fecha = utiles.getfechaInverse()
        hora = ""
        self.idcliente = self.incodigo.GetValue()
        idlistaprecio = 1
        turno = 1
        usuario = str(self.invendedora.GetValue())
        auditoria = fecha                
        sql = "INSERT INTO ventas(idventa,nrofactura,fecha,hora,idcliente,idlistaprecio,idformaticket,totalfactura,turno,sucursal,usuario,auditoria,descuento,iva,totalsiniva)"
        sql+= " VALUES ('%s', '%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')" % (str(self.idventa), str(self.nrofactura),str(fecha),str(hora),str(self.idcliente),str(idlistaprecio),str(idformaticket),str(self.intotal.GetValue()),str(turno),str(self.sucursal),str(usuario),str(auditoria),str(self.indesc.GetValue()),str(self.iva.GetValue()),str(self.ivadiscriminado.GetValue()))
        consultasBD.executaSinCommit(None, sql)
        sincronizar_tabla.addChange(sql=sql)            
    
        # GUARDO en tabla VENTASTIENEPRODUCTOS
        tablaSQL = "ventastieneproductos"        

        #lista de productos para dar de baja en el stock
        self.listaproductos = []

        #recorre la grilla
        for x in xrange(self.grid1.GetNumberRows()):
            #for y in xrange(10):
            #verifico que siguen los productos
            if (self.grid1.GetCellValue(x,1) != ""):
                ptc = self.grid1.GetCellValue(x,0)
                codbarraprod = self.grid1.GetCellValue(x,0)
                descri = self.grid1.GetCellValue(x,2)
                talle =  self.grid1.GetCellValue(x,3)
                color = self.grid1.GetCellValue(x,4)
                cantidad = self.grid1.GetCellValue(x,5)
                preciolista = self.grid1.GetCellValue(x,6)
                desc = self.grid1.GetCellValue(x,8)
                
                if (desc == ""):
                    desc = Decimal("0.00")
                preciofinal = self.grid1.GetCellValue(x,9)
                self.listaproductos.append((ptc,cantidad))
                
                tablaSQL = "ventastieneproductos"
                camposSQL = "(idticket,nrofactura,ptc,descri,talle,color,cantidad,preciolista,descuento,preciofinal,sucursal,idformaticket,usuario,auditoria)"
                valoresSQL = "('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')" % ( str(self.idventa),str(self.nrofactura),str(codbarraprod),str(descri),str(talle),str(color),str(cantidad),str(preciolista),str(desc),str(preciofinal),str(self.sucursal),str(idformaticket),str(usuario),str(auditoria) )

                sql = "INSERT INTO "+tablaSQL+camposSQL+" VALUES "+valoresSQL
                consultasBD.executaSinCommit(None, sql)
                sincronizar_tabla.addChange(sql=sql)                                    

        return self.idventa

    #modifica stock        
    def darBajaProductos(self,idventa, sucursal,lista,tipoventa):
        for (ptc, cant) in lista:
            stock = utiles.stock_sumado(ptc, sucursal, -Decimal(cant))     
            
            operacion = "venta"
            if int(tipoventa) == 999:
                operacion = "consignacion"
            if int(float(cant)) < 0:
                operacion = "devolucion_venta"
                
            print "operacion ", operacion
            print "cant ", cant
            print "tipoventa ", tipoventa
            
            utiles.agregar_movimiento(ptc, stock_previo= int(stock) + int(float(cant)), stock_nuevo=stock, operacion=operacion, idventa = idventa, sucursal=sucursal)
            
            sql = "UPDATE stock SET stock = '%s' WHERE ptc='%s' AND sucursal='%s' " % (str(stock), ptc, sucursal)
    
            sincronizar_tabla.addChange(sql=sql)
            consultasBD.executaSinCommit(None, sql)                  

# **************************************************************
                
    def OnIncodigoKillFocus(self, event):
        self.clubTxt.SetValue('')
        self.sussanClub = False
        self.refreshSussanClub()
        
        idcliente = self.incodigo.GetValue()
        self.cargarCliente(idcliente)        


    def hayclientecargado(self):
        if (self.incodigo.Value != "") and (self.inapellido.Value != "") and (self.haycliente==1):
            return True
        
        
        utiles.mensaje(self,"No se ha ingresado un Cliente")
        return False

# **************************************************************

    def cargarCliente(self, idcliente):
        if idcliente == "":
            return
        consultaSQL = "SELECT * FROM cliente WHERE idcliente = '%s'" % (idcliente)
        resultado = consultasBD.ordenCrudaDict(consultaSQL)
        if len(resultado) == 0:
            self.incodigo.SetValue("")
            utiles.mensaje(None,"Codigo de Cliente no encontrado")
            return
        resultado = resultado[0]
        self.__llenandoDatosCliente(resultado)        

    def procesarRenglon(self, fil, col):
        montoCuota = Decimal(self.grid3.GetCellValue(fil, 5)) - Decimal(self.grid3.GetCellValue(fil, 6))
        fechaActual = utiles.getfechaInverse()
        aux = self.grid3.GetCellValue(fil, 0)
        fechaRenglon = aux[6:]+"-"+aux[3:5]+"-"+aux[0:2]
        if montoCuota != Decimal("0"):
            noPagado = ( self.grid3.GetCellValue(fil,5) != self.grid3.GetCellValue(fil,6) )
            nuevoColor = BLANCO
            if self.grid3.GetCellValue(fil,1)[:3] == "Cta" and noPagado:
                if self.grid3.GetCellBackgroundColour(fil,0) == AMARILLO:
                    #nuevoColor = BLANCO #no marca recargo
                    self.totalCuotas[4] -= montoCuota
                    self.CtaCtePagos_detalle.remove(fil)
                else:
                    nuevoColor = AMARILLO #marca recargo
                    self.totalCuotas[4] += montoCuota
                    self.CtaCtePagos_detalle.append(fil)
            elif fechaActual == fechaRenglon and noPagado:
                if self.grid3.GetCellBackgroundColour(fil,0) == VERDE:
                    #nuevoColor = BLANCO #pago en fecha
                    self.totalCuotas[2] -= montoCuota
                    self.CtaCtePagos_detalle.remove(fil)
                else:
                    nuevoColor = VERDE #pago en fecha
                    self.totalCuotas[2] += montoCuota
                    self.CtaCtePagos_detalle.append(fil)
            elif fechaActual > fechaRenglon and noPagado:
                if self.grid3.GetCellBackgroundColour(fil,0) == ROJO:
                    #nuevoColor = BLANCO #vencido desmarcado
                    self.totalCuotas[1] -= montoCuota
                    self.CtaCtePagos_detalle.remove(fil)
                else:
                    nuevoColor = ROJO #vencido marcado
                    self.totalCuotas[1] += montoCuota
                    self.CtaCtePagos_detalle.append(fil)
            else:
                if noPagado:
                    if self.grid3.GetCellBackgroundColour(fil,0) == AZUL:
                        #nuevoColor = BLANCO #pago adelantado desmarcado
                        self.totalCuotas[3] -= montoCuota
                        self.CtaCtePagos_detalle.remove(fil)
                    else:
                        nuevoColor = AZUL #pago adelantado marcado
                        self.totalCuotas[3] += montoCuota
                        self.CtaCtePagos_detalle.append(fil)

            color = self.grid3.GetCellBackgroundColour(fil, 0)
            for i in xrange(self.grid3.GetNumberCols()):
               self.grid3.SetCellBackgroundColour(fil, i, nuevoColor)
            self.grid3.Refresh()
            if self.CtaCtePagos_detalle == []:
                self.totalCuotas = { 1:Decimal("0.00"), 2:Decimal("0.00"), 3:Decimal("0.00"), 4:Decimal("0.00") }
                self.totalAPagar = Decimal("0.00")

            aux = str(self.totalCuotas[1])
            aux = str(Decimal(aux).quantize(Decimal('0.10')))
            self.textVencido.SetLabel(aux)

            aux = str(self.totalCuotas[2])
            aux = str(Decimal(aux).quantize(Decimal('0.10')))
            self.textEnFecha.SetLabel(aux)

            aux = str(self.totalCuotas[3])
            aux = str(Decimal(aux).quantize(Decimal('0.10')))
            self.textFuturo.SetLabel(aux)

            aux = str(self.totalCuotas[4])
            aux = str(Decimal(aux).quantize(Decimal('0.10')))
            self.textRecargo.SetLabel(aux)

            self.calcularTotalAPagar()
        
# **************************************************************

    def OnProcesarDobleClick(self, event):
        id = self.incodigo.GetValue()
        if id != "" and self.grid3.GetCellValue(0, 0) != "":
            fil = self.grid3.GetGridCursorRow()
            col = self.grid3.GetGridCursorCol()
            self.procesarRenglon(fil, col)

# **************************************************************

    def OnBotonConsultar(self, event):
        id = self.incodigo.GetValue()
        if id != "":
            resultado = []
            if self.checkConsultaCompleta.GetValue() and not self.checkRangoFechas.GetValue(): #solo consulta completa desde una fecha X
                fechaDesde = str(self.fechaDesde.GetValue())[0:8]
                condicionFecha = "and vencimiento >= '"+fechaDesde[-2:]+"/"+fechaDesde[:2]+"/"+fechaDesde[3:5]+"'"
                resultado = CtasCtes.infoClientes(id, "", condicionFecha)
                self.llenarCtaCte(resultado[1])
            elif self.checkConsultaCompleta.GetValue() and self.checkRangoFechas.GetValue(): #consulta completa y por rango de fecha
                fecha1 = str(self.rangoFechaDesde.GetValue())[0:8]
                fecha2 = str(self.rangoFechaHasta.GetValue())[0:8]
                condicionFecha = "and vencimiento between '"+fecha1[-2:]+"/"+fecha1[:2]+"/"+fecha1[3:5]+"' and '"+fecha2[-2:]+"/"+fecha2[:2]+"/"+fecha2[3:5]+"'"
                resultado = CtasCtes.infoClientes(id, "", condicionFecha)
                self.llenarCtaCte(resultado[1])
            elif not self.checkConsultaCompleta.GetValue() and self.checkRangoFechas.GetValue():
                fecha1 = str(self.rangoFechaDesde.GetValue())[0:8]
                fecha2 = str(self.rangoFechaHasta.GetValue())[0:8]
                condicionFecha = "and vencimiento between '"+fecha1[-2:]+"/"+fecha1[:2]+"/"+fecha1[3:5]+"' and '"+fecha2[-2:]+"/"+fecha2[:2]+"/"+fecha2[3:5]+"'"
                resultado = CtasCtes.infoClientes(id, "and montocuota <> montopagado", condicionFecha)
                self.llenarCtaCte(resultado[1])
            else:
                resultado = CtasCtes.infoClientes(id, "and montocuota <> montopagado", "")
                self.llenarCtaCte(resultado[1])
        else:
            utiles.mensaje(self,"No hay informacion de cliente a procesar")

# **************************************************************

    def OnConsultaCompleta(self, event):
        id = self.incodigo.GetValue()
        if id != "":
            if self.checkConsultaCompleta.GetValue() and not self.checkRangoFechas.GetValue():
                self.textDesde.Enable(True)
                self.fechaDesde.Enable(True)
            else:
                self.textDesde.Enable(False)
                self.fechaDesde.Enable(False)

# **************************************************************

    def OnRangoFechas(self, event):
        id = self.incodigo.GetValue()
        if id != "":
            if self.checkRangoFechas.GetValue():
                self.textRangoDesde.Enable(True)
                self.rangoFechaDesde.Enable(True)
                self.textRangoHasta.Enable(True)
                self.rangoFechaHasta.Enable(True)
                if self.checkConsultaCompleta.GetValue():
                    self.textDesde.Enable(False)
                    self.fechaDesde.Enable(False)
            else:
                self.textRangoDesde.Enable(False)
                self.rangoFechaDesde.Enable(False)
                self.textRangoHasta.Enable(False)
                self.rangoFechaHasta.Enable(False)
                if self.checkConsultaCompleta.GetValue():
                    self.textDesde.Enable(True)
                    self.fechaDesde.Enable(True)

# **************************************************************

    def OnVencido(self, event): #ROJO
        id = self.incodigo.GetValue()
        if id != "" and self.grid3.GetCellValue(0, 0) != "":
            if self.checkVencido.GetValue():
                self.totalAPagar += self.totalCuotas[1]
            else:
                self.totalAPagar -= self.totalCuotas[1]
            aux = str(self.totalAPagar)
            self.textMontoAPagar.SetLabel(aux)

# **************************************************************

    def OnRecargo(self, event): #AMARILLO
        id = self.incodigo.GetValue()
        if id != "" and self.grid3.GetCellValue(0, 0) != "":
            if self.checkRecargo.GetValue():
                self.totalAPagar += self.totalCuotas[4]
            else:
                self.totalAPagar -= self.totalCuotas[4]
            aux = str(self.totalAPagar)
            self.textMontoAPagar.SetLabel(aux)

# **************************************************************

    def OnEnFecha(self, event): #VERDE
        id = self.incodigo.GetValue()
        if id != "" and self.grid3.GetCellValue(0, 0) != "":
            if self.checkEnFecha.GetValue():
                self.totalAPagar += self.totalCuotas[2]
            else:
                self.totalAPagar -= self.totalCuotas[2]
            aux = str(self.totalAPagar)
            self.textMontoAPagar.SetLabel(aux)

# **************************************************************

    def OnFuturo(self, event): #AZUL
        id = self.incodigo.GetValue()
        if id != "" and self.grid3.GetCellValue(0, 0) != "":
            if self.checkFuturo.GetValue():
                self.totalAPagar += self.totalCuotas[3]
            else:
                self.totalAPagar -= self.totalCuotas[3]
            aux = str(self.totalAPagar)
            self.textMontoAPagar.SetLabel(aux)                    

# **************************************************************

    def OnTotalDeuda(self, event):
        id = self.incodigo.GetValue()
        if id != "" and self.grid3.GetCellValue(0, 0) != "":
            if self.checkTotal.GetValue():
                self.textMontoAPagar.ChangeValue(self.textDeuda.GetLabel())
                valor = False
                self.checkVencido.Enable(valor)
                self.checkRecargo.Enable(valor)
                self.checkEnFecha.Enable(valor)
                self.checkFuturo.Enable(valor)
                self.grid3.Enable(valor)
                self.checkConsultaCompleta.Enable(valor)
                self.checkRangoFechas.Enable(valor)
                self.botonConsultar.Enable(valor)
                self.botonImprimir.Enable(valor)
                self.fechaDesde.Enable(valor)
                self.rangoFechaDesde.Enable(valor)
                self.rangoFechaHasta.Enable(valor)
            else:
                self.textMontoAPagar.ChangeValue(str(self.totalAPagar))
                valor = True
                self.checkVencido.Enable(valor)
                self.checkRecargo.Enable(valor)
                self.checkEnFecha.Enable(valor)
                self.checkFuturo.Enable(valor)
                self.grid3.Enable(valor)
                self.checkConsultaCompleta.Enable(valor)
                self.checkRangoFechas.Enable(valor)
                self.botonConsultar.Enable(valor)
                self.botonImprimir.Enable(valor)

# **************************************************************

    def OnBotonPagar(self, event):
        #se pagan las cuentas corrientes
        self.botonPagar.Disable()
        utiles.logOperaciones("Ventas.py: OnBotonPagar()")
        listaVencido, listaRecargo, listaEnFecha, listaFuturo = self.armarListasRegistrosMarcados()
        if not self.verificacionOkBotonPagar():
            self.botonPagar.Enable()
            return False
        consultaSQL = "SELECT idcliente,nombre,nrodoc,situacionfiscal,tipodoc,direccion FROM cliente WHERE IDCLIENTE = '%s'" % str(self.incodigo.GetValue())
        datosCliente = consultasBD.ordenCrudaDict(consultaSQL)
        if len(datosCliente) == 0:
            utiles.mensaje(None,"No se han podido recuperar los datos del cliente\npara imputar los pagos")
            self.botonPagar.Enable()
            return 0
        datosCliente = datosCliente[0]

        try:
            utiles.logOperaciones("Procesando los valores recibidos por pagos en cuentas corrientes")
            consultasBD.begin()
            resultado = Pagos.guardarValoresRecibidosCtaCte(self.grid3,self.grid4, \
                                                            self.textMontoVaPagando.GetValue(),self.textMontoAPagar.GetValue(), \
                                                            self.incodigo.GetValue(), datosCliente, \
                                                            listaVencido, \
                                                            listaRecargo, \
                                                            listaEnFecha, \
                                                            listaFuturo, \
                                                            self.invendedora.GetValue())

            consultasBD.commit()
            if resultado:
                utiles.mensaje(self, "Cobro procesado")
                self.limpiarCtaCtePagos()
                self.OnBotonConsultar(event)
            self.botonPagar.Enable()
        except Exception, e:
            print e.__str__()
            utiles.mensaje(self, "No se pudo guardar el cobro")
            utiles.logOperaciones("ERROR: no se guardo el cobro de la cuenta corriente")
            consultasBD.rollback()     
            self.botonPagar.Enable()

# **************************************************************

    def armarListasRegistrosMarcados(self):
        CtaCtePagos_vencido = []
        if self.checkVencido.GetValue():
            for fil in xrange(self.grid3.GetNumberRows()):
                if self.grid3.GetCellBackgroundColour(fil,0) == ROJO:
                    CtaCtePagos_vencido.append(fil)
        CtaCtePagos_recargo = []
        if self.checkRecargo.GetValue():
            for fil in xrange(self.grid3.GetNumberRows()):
                if self.grid3.GetCellBackgroundColour(fil,0) == AMARILLO:
                    CtaCtePagos_recargo.append(fil)
        CtaCtePagos_enfecha = []
        if self.checkEnFecha.GetValue():
            for fil in xrange(self.grid3.GetNumberRows()):
                if self.grid3.GetCellBackgroundColour(fil,0) == VERDE:
                    CtaCtePagos_enfecha.append(fil)
        CtaCtePagos_futuro = []
        if self.checkFuturo.GetValue():
            for fil in xrange(self.grid3.GetNumberRows()):
                if self.grid3.GetCellBackgroundColour(fil,0) == AZUL:
                    CtaCtePagos_futuro.append(fil)
        return CtaCtePagos_vencido, CtaCtePagos_recargo, CtaCtePagos_enfecha, CtaCtePagos_futuro

    def verificacionOkBotonPagar(self):
        if not self.hayclientecargado(): return False
        if Decimal(self.textMontoAPagar.GetValue()) <= Decimal("0.00"):
            utiles.mensaje(self,"Debe informar un monto valido a pagar")
            return False
        if self.invendedora.GetValue() == "":
            utiles.mensaje(self,"Debe seleccionar el nombre de la vendedora")
            return False
        if self.textSaldoInicial.GetValue() != "0.00":
            texto = "ATENCION!!\n"
            texto+= "El cliente tiene Saldo Inicial y usted\n"
            texto+= "ha escogido pagar deuda mas reciente.\n\n"
            texto+= "Desea pagar lo mas reciente?\n(Aceptar = si, Cancelar = No)"
            if not utiles.dialog2(self,texto): return False
        if  Decimal(self.textMontoAPagar.GetValue()) < Decimal(self.textMontoVaPagando.GetValue()):
            texto = "Los valores informados exceden el monto\n"
            texto+= "que se desea cancelar. El exceso se imputara\n"
            texto+= "a cuotas impagas, futuros vencimientos o\n"
            texto+= "a favor del cliente en la cuenta corriente.\n"
            texto+= "Total a pagar: $"+self.textMontoAPagar.GetValue()+"\n"
            texto+= "Total informado: $"+self.textMontoVaPagando.GetValue()+"\n\n"
            texto+= "Desea continuar? (Aceptar = si, Cancelar = No)"
            if not utiles.dialog2(self,texto): return False
        if Decimal(self.textMontoAPagar.GetValue()) > Decimal(self.textMontoVaPagando.GetValue()):
            texto = "Los valores informados no son suficientes para\n"
            texto+= "el total de cuotas que se pretende cancelar.\n"
            texto+= "Solo se cancelaran las cuotas que permita\n"
            texto+= "cubrir el total informado de $"+self.textMontoVaPagando.GetValue()+"\n\n"
            texto+= "Desea continuar? (Aceptar = si, Cancelar = No)"
            if not utiles.dialog2(self,texto): return False
        if self.checkTotal.GetValue():
            self.checkTotal.SetValue(False)
            self.OnTotalDeuda(None)
        return True

# **************************************************************

    def verificoSiEsDescuento(self,fil):
        for fil in xrange(self.grid1.GetNumberRows()):
            celda = self.grid1.GetCellValue(fil,8)
            try:
                celda = Decimal(celda)
            except:
                celda = Decimal("0.00")
            if  celda != Decimal("0.00"):
                formaDePago = self.grid2.GetCellValue(fil,0)
                if self.verificoTarjetaPromocion(formaDePago) or \
                    formaDePago in ["CC","CC1","CC2","CC3","CC4"]:
                    texto = "No puede emplear Tarjeta de Credito\n"
                    texto+= "o Cta Cte para pagos de productos que\n"
                    texto+= "incluyen descuentos."
                    utiles.mensaje(None,texto)
                    return False
        return True

    def OnGrid2FormaDePago(self, event):
        #cambio en la grilla forma de pago de Facturacion
        cantidadRenglones = self.grid2.GetNumberRows()
        cantidadColumnas = self.grid2.GetNumberCols()

        #determina si hay notas de credito y si se usan para pagar lo que se lleva
        bandera = True
        for fila in xrange(cantidadRenglones):
            if (str(self.grid2.GetCellValue(fila,0)).upper() == "NC") and (bandera):
                valorNC = ( Decimal("-1")*Decimal(str(self.totalNC)) ).quantize(Decimal('0.10'))
                valorTOTAL = Decimal( self.intotal.GetValue() ).quantize(Decimal('0.10'))
                if valorTOTAL < valorNC:
                    valorNC = valorTOTAL
                self.grid2.SetCellValue(fila,4,str(valorNC))
                bandera = False
            elif (str(self.grid2.GetCellValue(fila,0)).upper() == "NC"):
                for col in xrange(cantidadColumnas):
                    self.grid2.SetCellValue(fila,col,"")

        for fila in xrange(cantidadRenglones):
            for columna in xrange(cantidadColumnas):
                if utiles.isDecimal(self.grid2.GetCellValue(fila,columna)):
                    self.grid2.SetCellValue(fila,columna,"%0.02f" % Decimal(self.grid2.GetCellValue(fila,columna)))
        self.grid2.ForceRefresh()
        if (Decimal(self.intotal.GetValue()) != Decimal("0")) and (self.inconsignacion.Value == False) :
            #se verifica que hay algo que pagar y que no sea mercaderia en consignacion
            aux = Decimal("0.00")
            for fil in xrange(self.grid1.GetNumberRows()):
                if self.grid1.GetCellValue(fil,0)=="finan":
                    aux = Decimal(self.grid1.GetCellValue(fil,9))
                    break
            miTotal = (Decimal(self.intotal.GetValue())-aux).quantize(Decimal("0.10"))
            retorno = Pagos.verificaActualiza(self.grid2, miTotal, self.opcion.Selection+1, 1, self.incodigo.GetLabel())
            vaPagando = str(retorno[0])
            error = retorno[1]
            if error != None: 
                utiles.mensaje(self,error[0])
            self.inpagando.ChangeValue(vaPagando)
        else:
            mensaje = "El total a pagar es 0"
            utiles.mensaje(self,mensaje)
            for fil in xrange(cantidadRenglones):
                for col in xrange(cantidadColumnas):
                    self.grid2.SetCellValue(fil,col,"")
            self.inpagando.ChangeValue("")
        self.grid2.ForceRefresh()                       

        marca = False
        aux = Decimal("0.00")
        for fil in xrange(self.grid2.GetNumberRows()):
            if self.grid2.GetCellValue(fil,0)=='regalo' or \
               self.grid2.GetCellValue(fil,0)=='Regalo':
                for fila in xrange(self.grid1.GetNumberRows()):
                    if self.grid1.GetCellValue(fila,0)=="":
                        continue
                    self.grid1.SetCellValue(fila,8,"99.99")
                self.OnGrid1CambiaGrilla(None)
                self.grid2.SetFocus()
            if not (self.grid2.GetCellValue(fil,0)).upper() in ["CH","P","MAES","DEB","VIEL","BOUCHER","DEPO","TRAN",""]:
                verificado = self.verificoSiEsDescuento(fil)
                if not verificado:
                    for col in xrange(self.grid2.GetNumberCols()):
                        self.grid2.SetCellValue(fil,col,"")
                    return
            if (self.grid2.GetCellValue(fil,0)).upper() in ["CC","CC1","CC2","CC3","CC4"]:
                aux+= Decimal(self.grid2.GetCellValue(fil,4))
                marca = True
        if marca:
            financiacion = (aux-aux/Decimal("1.10")).quantize(Decimal("0.10"))
            for fila in xrange(self.grid1.GetNumberRows()):
                if self.grid1.GetCellValue(fila,0)=="finan":
                    break
                if self.grid1.GetCellValue(fila,0)=="":
                    self.grid1.SetCellValue(fila,0,"finan") # ptc
                    self.grid1.SetCellValue(fila,1,"") #codigo
                    self.grid1.SetCellValue(fila,2,"Financiacion CC") #descripcion
                    self.grid1.SetCellValue(fila,3,"") #talle
                    self.grid1.SetCellValue(fila,4,"") #color
                    self.grid1.SetCellValue(fila,5,"1") #cantidad
                    self.grid1.SetCellValue(fila,6,str(financiacion)) #cost.unitario
                    self.grid1.SetCellValue(fila,7,str(financiacion)) #subtotal
                    self.grid1.SetCellValue(fila,8,"0.00") #descuento
                    self.grid1.SetCellValue(fila,9,str(financiacion)) #total
                    break
            self.actualizaSubtotal()
            self.grid1.ForceRefresh()

    def verificoTarjetaPromocion(self,codigoFormaPago):
        sql = "SELECT * FROM valorespromociones WHERE tarjeta='"+codigoFormaPago+"' "
        resultado = consultasBD.ordenCrudaDict(sql)
        if resultado == () or resultado == None or len(resultado)==0:
            return False
        diaDeLaSemana = str(utiles.getDiaSemana())
        for item in resultado:
            dia = item["dia"]
            if diaDeLaSemana in dia:
                return True
        return False

    def OnGrid4FormaPago(self, event):
        #cambio en la grilla forma de pago de Cuenta Corrientes
        cantidadRenglones = self.grid4.GetNumberRows()

        fil = self.grid4.GetGridCursorRow()
        codigoFormaPago = self.grid4.GetCellValue(fil,0) #codigo forma de pago
        if self.verificoTarjetaPromocion(codigoFormaPago):
            texto = "No puede usar esa tarjeta para pagos\n"
            texto+= "en la Cuenta Corriente. Es una tarjeta\n"
            texto+= "cuyo banco tiene PROMOCION en este dia.\n"
            utiles.mensaje(None,texto)
            for col in xrange(self.grid4.GetNumberCols()):
                self.grid4.SetCellValue(fil,col,"")
            return

        #determina si hay notas de credito y si se usan para pagar lo que se lleva
        #si se paga cuenta corriente, las NC deberian aparecer y no es necesario
        #marcarlas
        for fila in xrange(cantidadRenglones):
            if (str(self.grid4.GetCellValue(fila,0)).upper() == "NC"):
                for col in xrange(self.grid4.GetNumberCols()):
                    self.grid4.SetCellValue(fila,col,"")

        if (Decimal(self.textMontoAPagar.GetValue()) != Decimal("0")):
            cantidadRenglones = self.grid4.GetNumberRows()
            cantidadColumnas = self.grid4.GetNumberCols()
            for fila in xrange(cantidadRenglones):
                for columna in xrange(cantidadColumnas):
                    if utiles.isDecimal(self.grid4.GetCellValue(fila,columna)):
                        self.grid4.SetCellValue(fila,columna,"%0.02f" % Decimal(self.grid4.GetCellValue(fila,columna)))
            self.grid4.ForceRefresh()
            #se verifica que hay algo que pagar y que no sea mercaderia en consignacion
            retorno = Pagos.verificaActualiza(self.grid4, self.textMontoAPagar.GetValue(), self.opcion.Selection+1, 2, self.incodigo.GetLabel())

            vaPagando = str(retorno[0])
            error = retorno[1]
            if error != None: 
                utiles.mensaje(self,error[0])
            self.textMontoVaPagando.ChangeValue(vaPagando)
            self.grid4.ForceRefresh()
        else:
            mensaje = "El total a pagar es 0. Verifique"
            utiles.mensaje(self,mensaje)
            for fil in xrange(cantidadRenglones):
                for col in xrange(5):
                    self.grid4.SetCellValue(fil,col,"")
            self.textMontoVaPagando.ChangeValue("0.00")
            self.grid4.ForceRefresh()                       

    def OnProcesarRecargo(self, event):
        fil = self.grid3.GetGridCursorRow()
        if self.grid3.GetCellBackgroundColour(fil,0) == AMARILLO:
            texto  = "ATENCION: ESTA POR ANULAR UN RECARGO\n\n"
            texto += "Fecha        : "+self.grid3.GetCellValue(fil, 0)+"\n"
            texto += "Descripcion: "+self.grid3.GetCellValue(fil, 1)+"\n"
            texto += "Importe     : $"+self.grid3.GetCellValue(fil, 5)+"\n\n"
            texto += "Desea continuar? (Aceptar = si, Cancelar = no)"
            if utiles.dialog2(self,texto):
                #Contesto afirmativamente
                idrecargo = self.grid3.GetCellValue(fil, 1).split()[-1:][0]
                #***********************************************************************
                tabla          = "vtas_recargos"
                camposyvalores = "idrecibo = '-1'"
                condicion      = "idrecargo = '"+idrecargo+"'"
                consultaSQL = "UPDATE "+tabla+" SET "+camposyvalores+" WHERE "+condicion
                ultimoid = consultasBD.executa(None,consultaSQL)
                #***********************************************************************
                self.totalCuotas[4] -= Decimal(self.grid3.GetCellValue(fil,5))
                self.OnBotonConsultar(event)

    def calcularTotalAPagar(self):
        id = self.incodigo.GetValue()
        if id != "" and self.grid3.GetCellValue(0, 0) != "":
            self.totalAPagar = Decimal("0.00")
            if self.checkVencido.GetValue(): self.totalAPagar += self.totalCuotas[1]
            if self.checkRecargo.GetValue(): self.totalAPagar += self.totalCuotas[4]
            if self.checkEnFecha.GetValue(): self.totalAPagar += self.totalCuotas[2]
            if self.checkFuturo.GetValue(): self.totalAPagar += self.totalCuotas[3]
            aux = str(self.totalAPagar)
            aux = str(Decimal(aux).quantize(Decimal("0.10")))
            self.textMontoAPagar.SetLabel(aux)

# **************************************************************

    def imprimeTICKETFISCAL(self, tipo = 1):
        print "IMPRIMIENDO FACTURA"
        listaPie = [" ","Vendedora: "+str(self.comboVendedora.GetValue()),"Codg. cliente:"+str(self.incodigo.GetValue())," ","MUCHAS GRACIAS POR SU COMPRA"]
        utiles.logOperaciones("Ventas.py: imprimeTICKETFISCAL()")

        #obtenemos el numero de documento segun tipo de operacion
        sucursal= self.sucursal
        if tipo == 999:
            self.nrofactura = utiles.obtenerNumeroConsignacion(str(sucursal))
        elif tipo == 1:
            self.nrofactura = long(self.innrofactura.GetValue())
        else:
            self.nrofactura = utiles.obtenerNumeroVenta2(str(sucursal))
        
        consultaSQL = "SELECT nombre,nrodoc,situacionfiscal,tipodoc,direccion FROM cliente WHERE IDCLIENTE = '%s'" % str(self.incodigo.GetValue())
        datosCliente = consultasBD.ordenCrudaDict(consultaSQL)
        if len(datosCliente) == 0:
            utiles.mensaje(None,"No se han podido recuperar los datos del cliente\npara confeccionar la factura")
            return 0
        datosCliente = datosCliente[0]
        listaTotalizadores = [Decimal(self.indesc.GetValue()), \
                                Decimal(self.iva.GetValue()), \
                                Decimal(self.ivadiscriminado.GetValue()), \
                                Decimal(self.intotal.GetValue())]
        imprimio = 0
        if tipo == 1:
            if self.inSituacionFiscal.GetValue() == "Inscripto":
                imprimio = ImpresionFiscal.imprimeFacturaA(datosCliente,self.grid1,self.grid2,listaTotalizadores,listaPie)
            else:
                imprimio = ImpresionFiscal.imprimeFacturaB(datosCliente,self.grid1,self.grid2,listaTotalizadores,listaPie)
        elif tipo == 2:
                imprimio = Imprimir.impresionTipo2(self.incodigo.GetValue(),self.nrofactura,2,datosCliente,self.grid1,self.grid2,listaTotalizadores,listaPie)
        else:
            imprimio = Imprimir.impresionTipo2(self.incodigo.GetValue(),self.nrofactura,999,datosCliente,self.grid1,self.grid2,listaTotalizadores,listaPie)

        return imprimio

    def imprimeNOTACREDITOFISCAL(self, nronotacredito, tipo=1):
        print "IMPRIMIENDO NOTA DE CREDITO"
        listaPie = [" ","Vendedora: "+str(self.comboVendedora.GetValue()),"Codg. cliente:"+str(self.incodigo.GetValue())," ","NOTA DE CREDITO"]
        utiles.logOperaciones("Ventas.py: imprimeNOTACREDITOFISCAL()")

        consultaSQL = "SELECT nombre,nrodoc,situacionfiscal,tipodoc,direccion FROM cliente WHERE IDCLIENTE = '%s'" % str(self.incodigo.GetValue())
        datosCliente = consultasBD.ordenCrudaDict(consultaSQL)
        if len(datosCliente) == 0:
            utiles.mensaje(None,"No se han podido recuperar los datos del cliente\npara confeccionar la factura")
            return 0
        datosCliente = datosCliente[0]
        listaTotalizadores = [Decimal(self.indesc.GetValue()), \
                                Decimal(self.iva.GetValue()), \
                                Decimal(self.ivadiscriminado.GetValue()), \
                                Decimal(self.intotal.GetValue())]
        imprimio = 0
        if tipo == 1:
            if self.inSituacionFiscal.GetValue() == "Inscripto":
                imprimio = ImpresionFiscal.imprimeNotaCreditoA(datosCliente,self.grid1,self.grid2,listaTotalizadores,listaPie)
            else:
                imprimio = ImpresionFiscal.imprimeNotaCreditoB(datosCliente,self.grid1,self.grid2,listaTotalizadores,listaPie)
        else:
            imprimio = Imprimir.impresionNotaCreditoTipo2(self.incodigo.GetValue(),nronotacredito,2,datosCliente,self.grid1,listaTotalizadores,listaPie)

        return imprimio


# **************************************************************

    def ProcesarValoresRecibidos(self, tipoOperacion):
        if tipoOperacion != 999:
            #se procesa el pago de la mercaderia, si es entregada en consignacion no se procesa
            totalSaldo = self.textDeuda.GetLabel()
            if utiles.isDecimal(totalSaldo):
                totalSaldo = Decimal(totalSaldo)
            else:
                totalSaldo = Decimal("0.00")

            retorno = Pagos.guardarValoresRecibidos(self.grid2,self.idventa,self.nrofactura,self.padre.sucursalNro,self.incodigo.GetValue(),self.invendedora.GetValue(),totalSaldo)
            if retorno[1] == -1:
                utiles.mensaje(self,retorno[0])
            else:
                return retorno[0]
        return []

#  ************************************************************

    def OnTipoVenta(self, event):
        self.ponerNumeroComprobante()
        
        #controlando formas de pago
        tipoVenta = self.opcion.Selection + 1
        if tipoVenta == 2:
            self.OnGrid2FormaDePago(None)
            self.grid2.ForceRefresh()                       

        
    def OnPagarSaldoInicial(self, event):
        utiles.logOperaciones("Ventas.py: OnPagarSaldoInicial()")
        valoresEntregados = Decimal(self.textMontoVaPagando.GetValue())
        montoAPagar = Decimal(self.textMontoAPagar.GetValue())
        saldoInicial = Decimal(self.textSaldoInicial.GetValue())

        #verificaciones iniciales
        if self.invendedora.GetValue() == "":
            utiles.mensaje(self,"Debe seleccionar el nombre de la vendedora")
            return False
        if not self.hayclientecargado(): return False
        if valoresEntregados != montoAPagar:
            utiles.mensaje(None,"No coincide el total de valores informados\ncon lo que se desea pagar. Verifique.")
            return False
        if valoresEntregados > saldoInicial:
            utiles.mensaje(None,"No pueden entregarse mas valores\nque lo adeudado como saldo inicial del sistema.")
            return False
        if valoresEntregados == Decimal("0.00"):
            utiles.mensaje(None,"No hay valores para procesar")
            return False
        consultaSQL = "SELECT nombre,nrodoc,situacionfiscal,tipodoc,direccion FROM cliente WHERE IDCLIENTE = '%s'" % str(self.incodigo.GetValue())
        datosCliente = consultasBD.ordenCrudaDict(consultaSQL)
        if len(datosCliente) == 0:
            utiles.mensaje(None,"No se han podido recuperar los datos del cliente\npara confeccionar la factura")
            return 0
        datosCliente = datosCliente[0]

        #procesando el pago
        try:
            utiles.logOperaciones("Cancelando saldo de migracion")
            consultasBD.begin()            
            Pagos.cancelandoSaldoMigracion(datosCliente,self.grid4,valoresEntregados,saldoInicial,self.incodigo.GetValue(),self.invendedora.GetValue())
            consultasBD.commit()
            utiles.mensaje(self, "Cobro procesado")
            self.limpiarCtaCtePagos()
            self.OnBotonConsultar(event)
        except Exception, e:
            print e.__str__()
            utiles.logOperaciones("ERROR: no pudo procesarse el pago del saldo migracion")
            utiles.mensaje(self, "No se pudo guardar el cobro")
            consultasBD.rollback()     

    def OnDescuentoEnter(self, event):
        descuentoItem = Decimal("0.00")
        for fil in xrange(self.grid1.GetNumberRows()):
            if utiles.isDecimal(self.grid1.GetCellValue(fil, 8)):
                descuentoItem += Decimal(self.grid1.GetCellValue(fil, 8))
        if descuentoItem != Decimal("0.00"):
            utiles.mensaje(None,"No puede ingresar un Descuento general\nhabiendo informado Descuentos por items")
            self.indesc.SetValue("0.00")
            return
        descuento = self.indesc.GetValue()
        if not utiles.isDecimal(descuento):
            utiles.mensaje(None,"Debe ingresar valores numericos")
            self.indesc.SetValue("0.00")
            return
        self.indesc.SetValue("%0.02f" % Decimal(descuento))
        if not utiles.isDecimal(descuento):
            utiles.mensaje(None,"Debe ingresar valores numericos")
            self.indesc.SetValue("0.00")
            return
        self.indesc.SetValue("%0.02f" % Decimal(descuento))
        self.totalfactura()            

    def OnDescuentoPerderFoco(self, event):
        self.OnDescuentoEnter(event)

    def OnMontoAPagar(self, event):
        if not utiles.isDecimal(self.textMontoAPagar.GetValue()):
            utiles.mensaje(None,"Debe introducir un valor numerico")

    def ponerNumeroComprobante(self):
        if self.incodigo.GetValue() == "":
            return False
        #sucursal = utiles.getSucursalActiva()
        sucursal = self.sucursal
        nro = 0
        if self.inconsignacion.GetValue():
            nro = utiles.obtenerNumeroConsignacion(str(sucursal))
        else:
            nro = 0
            if self.opcion.Selection == 0:
                if self.inSituacionFiscal.GetValue() == "Inscripto":
                    nro = utiles.obtenerNumeroVentaA(str(sucursal))
                else:
                    nro = utiles.obtenerNumeroVentaB(str(sucursal))
            else:
                nro = utiles.obtenerNumeroVenta2(str(sucursal))
        self.nrofactura = nro
        self.innrofactura.ChangeValue(str(nro))
        return True

#  ************************************************************

    def OnDevolucionClick(self, event):
        sql = "SELECT diasdevoluciones FROM parametros WHERE sucursal = '%s'" % (self.sucursal)
        resultados = consultasBD.ordenCrudaDict(sql)
        diasdevoluciones = resultados[0]["diasdevoluciones"]*-1
        fechaLimite = utiles.sumarDiasLaboralesAFecha(diasdevoluciones)
        idcliente = self.incodigo.GetValue()
        sql = "SELECT count(*) FROM ventas v, ventastieneproductos vp WHERE v.idcliente = '%s' AND v.idventa = vp.idticket AND vp.cantidad <> vp.devuelto AND v.fecha >= '%s' AND v.sucursal = '%s' AND v.totalfactura > 0 ORDER BY fecha" % (idcliente, fechaLimite, self.sucursal)
        resultados = consultasBD.ordenCrudaDict(sql)
        if resultados[0]['count(*)'] == 0:
            utiles.mensaje(None,"No hay informacion de venta para efectuar\ndevoluciones sobre el cliente seleccionado")
            return
        ventana = Devoluciones.Dialog1(self, idcliente, diasdevoluciones)
        self.devoluciones = []
        try:
            ventana.ShowModal()
            if ventana.getAceptado():
                self.devoluciones = ventana.getDevoluciones()
                self.opcion.SetSelection(ventana.getActivado()-1) # determina tipooperacion, 1 o 2, segun grilla de devolucion activada en Devolucion.py
                self.OnTipoVenta(None)
                self.grid1.ClearGrid()
                fila = 0
                if ventana.getHayClienteRegalo():
                    self.clienteRegalo = ventana.getClienteRegalo()
                    self.incodigo.SetValue(self.clienteRegalo['idcliente'])
                    self.inapellido.SetValue(self.clienteRegalo['nombre'])
                    self.indireccion.SetValue(self.clienteRegalo['direccion'])
                    self.incumple.SetValue(self.clienteRegalo['cumple'])
                    self.intelefono.SetValue(self.clienteRegalo['telefono'])
                    self.inemail.SetValue(self.clienteRegalo['email'])
                    self.inSituacionFiscal.SetValue(self.clienteRegalo['situacionfiscal'])
                    #self.OnIncodigoKillFocus(None)
                else:
                    self.clienteRegalo = None
                for item in self.devoluciones:
                    self.grid1.SetCellValue(fila,0,item["ptc"])
                    self.grid1.SetCellValue(fila,1,item["codigo"])
                    self.grid1.SetCellValue(fila,2,item["descri"])
                    self.grid1.SetCellValue(fila,3,item["talle"])
                    self.grid1.SetCellValue(fila,4,item["color"])
                    self.grid1.SetCellValue(fila,5,str(Decimal("-1")*Decimal(str(item["devolucionactual"]))))
                    self.grid1.SetCellValue(fila,6,str(item["preciolista"]))
                    self.actualizaSubtotal()
                    self.grid1.SetCellValue(fila,8,str(item["descuento"]))
                    self.actualizaSubtotal()
                    fila += 1
                for i in xrange(self.grid1.GetNumberRows()):
                    for j in xrange(self.grid1.GetNumberCols()):
                        self.grid1.SetReadOnly(i,j)
                
                self.grid1.Refresh()
                self.staticText1.Show(False)
                self.grid2.Show(False)
                self.staticText6.Show(False)
                self.inpagando.Show(False)
                self.inconsignacion.Show(False)
                self.facturacion.SetLabel("Nota de Credito")
            else:
                self.grid1.ClearGrid()
                self.actualizaSubtotal()
                self.staticText1.Show(True)
                self.grid2.Show(True)
                self.staticText6.Show(True)
                self.inpagando.Show(True)
                self.inconsignacion.Show(True)
                self.facturacion.SetLabel("Facturacion")
        finally:
            ventana.Destroy()

    def OnBotonImprimir(self, event):
        id = self.incodigo.GetValue()
        if id == "":
            return
        checkDesde = self.checkConsultaCompleta.GetValue()
        fechaDesde = str(self.fechaDesde.GetLabel()).replace("/","-")
        #fechaDesde = fechaDesde[-4:]+"-"+fechaDesde[:2]+"-"+fechaDesde[3:5]
        fechaDesde = utiles.invertirFecha(fechaDesde)
        listaDesde = [checkDesde,fechaDesde]
        checkRango = self.checkRangoFechas.GetValue()
        rangoDesde = str(self.rangoFechaDesde.GetLabel()).replace("/","-")
        #rangoDesde = rangoDesde[-4:]+"-"+rangoDesde[:2]+"/"+rangoDesde[3:5]
        rangoDesde = utiles.invertirFecha(rangoDesde)
        rangoHasta = str(self.rangoFechaHasta.GetLabel()).replace("/","-")
        #rangoHasta = rangoHasta[-4:]+"-"+rangoHasta[:2]+"/"+rangoHasta[3:5]
        rangoHasta = utiles.invertirFecha(rangoHasta)
        listaRango = [checkRango,rangoDesde,rangoHasta]
        CtasCtes.botonImprimirCtaCte(id,listaDesde,listaRango)

    def OnBuscarCuota(self, event):
        id = self.incodigo.GetValue()
        if id == "":
            utiles.mensaje(None,"Debe indicarse un codigo y nombre de cliente")
            return
        buscarCuota = BuscarCuota.Dialog1(None,self.incodigo.GetValue(),self.inapellido.GetValue())
        try:
            buscarCuota.ShowModal()
            consultaSQL = buscarCuota.getConsultaSQL()
            if consultaSQL == "":
                return
            resultado = CtasCtes.infoClientes2(consultaSQL)
            if resultado != "":
                self.llenarCtaCte(resultado)
        finally:
            buscarCuota.Destroy()   

    def OnConsignacion(self, event):
        sql = "SELECT diasconsignaciones FROM parametros WHERE sucursal = '%s'" % (self.sucursal)
        resultados = consultasBD.ordenCrudaDict(sql)
        diasconsignaciones = resultados[0]["diasconsignaciones"]*-1
        fechaLimite = utiles.sumarDiasLaboralesAFecha(diasconsignaciones)
        idcliente = self.incodigo.GetValue()
        sql = "SELECT count(*) FROM ventas v, ventastieneproductos vp WHERE v.idcliente = '%s' AND v.idformaticket = '999' AND v.idventa = vp.idticket AND vp.cantidad <> vp.devuelto AND v.fecha >= '%s' AND v.sucursal = '%s' ORDER BY fecha" % (idcliente, fechaLimite, self.sucursal)
        resultados = consultasBD.ordenCrudaDict(sql)
        if resultados[0]['count(*)'] == 0:
            utiles.mensaje(None,"No hay informacion sobre consignaciones\npendientes para este cliente.")
            return
        ventana = Consignaciones.Dialog1(self, idcliente, diasconsignaciones)
        self.consignacion = []
        try:
            ventana.ShowModal()
            if ventana.getAceptado():
                self.consignacion = ventana.getConsignaciones()
                self.grid1.ClearGrid()
                fila = 0
                for item in self.consignacion:
                    self.grid1.SetCellValue(fila,0,item["ptc"])
                    self.grid1.SetCellValue(fila,1,item["codigo"])
                    self.grid1.SetCellValue(fila,2,item["descri"])
                    self.grid1.SetCellValue(fila,3,item["talle"])
                    self.grid1.SetCellValue(fila,4,item["color"])
                    self.grid1.SetCellValue(fila,5,str(item["cantidad"]))
                    self.grid1.SetCellValue(fila,6,str(item["preciolista"]))
                    self.actualizaSubtotal()
                    self.grid1.SetCellValue(fila,8,str(item["descuento"]))
                    self.actualizaSubtotal()
                    fila += 1
                for i in xrange(self.grid1.GetNumberRows()):
                    for j in xrange(self.grid1.GetNumberCols()):
                        self.grid1.SetReadOnly(i,j)
        finally:
            ventana.Destroy()

    def OnModifClienteButton(self, event):
        idcliente = str(self.incodigo.GetValue())
        if idcliente != "":
            ventana = ModificaClientes.ModifClientes(self,idcliente)
            try:
                ventana.ShowModal()
            finally:
                ventana.Destroy()
        else:
             utiles.mensaje(self,"No hay un cod. de cliente cargado")

    def OnInrecargoTextEnter(self, event):
        recargo = Decimal("0.00")
        for fil in xrange(self.grid1.GetNumberRows()):
            if utiles.isDecimal(self.grid1.GetCellValue(fil, 8)):
                recargo += Decimal(self.grid1.GetCellValue(fil, 8))
        if recargo != Decimal("0.00"):
            utiles.mensaje(None,"No puede ingresar un Descuento general\nhabiendo informado Descuentos por items")
            self.inrecargo.SetValue("0.00")
            return
        recargo = self.inrecargo.GetValue()
        if not utiles.isDecimal(recargo):
            utiles.mensaje(None,"Debe ingresar valores numericos")
            self.inrecargo.SetValue("0.00")
            return
        self.inrecargo.SetValue("%0.02f" % Decimal(recargo))
        if not utiles.isDecimal(recargo):
            utiles.mensaje(None,"Debe ingresar valores numericos")
            self.indesc.SetValue("0.00")
            return
        self.inrecargo.SetValue("%0.02f" % Decimal(recargo))
        self.totalfactura()            

    def OnInrecargoKillFocus(self, event):
        self.OnInrecargoTextEnter(event)

    def OnClubKillFocus(self, event):
        self.OnBuscaxapellidoButton(None)
##        if not self.clubTxt.GetValue(): return
##        
##        club_id = clubManager.clean_club_id(self.clubTxt.GetValue())
##        idcliente = clubManager.find_client_id(club_id)
##        if not idcliente:
##            utiles.mensaje(self, "Tarjeta Sussan Club inexistente")
##            self.clubTxt.SetValue('')
##            self.sussanClub = False
##            self.refreshSussanClub()
##            return
##        
##        self.sussanClub = True
##        self.refreshSussanClub()
##            
##        self.incodigo.SetValue(idcliente)
##        #self.OnIncodigoKillFocus(event)
##        self.cargarCliente(idcliente)

    def OnClubButton(self, event):
        idcliente = str(self.incodigo.GetValue())
        if idcliente != "":
            ventana = ClubSussan.Dialog1(self,idcliente,self.clubTxt.GetValue())
            try:
                ventana.ShowModal()
            finally:
                ventana.Destroy()
        else:
             utiles.mensaje(self,"No hay un cod. de cliente cargado")

    def OnPuntosTxtKillFocus(self, event):
        club_id = self.clubTxt.GetValue()
        club_id_clean = clubManager.clean_club_id(club_id)
        
        points = int(self.puntosTxt.GetValue())
        money = clubManager.points_to_money(club_id_clean, points)
        self.puntosDineroTxt.SetValue(str(money))

    def OnPuntosDineroTxtKillFocus(self, event):
        club_id = self.clubTxt.GetValue()
        club_id_clean = clubManager.clean_club_id(club_id)
        
        money = float(self.puntosDineroTxt.GetValue())
        points = clubManager.money_to_points(club_id_clean, money)
        self.puntosTxt.SetValue(str(points))
        
    def refreshSussanClub(self):
        if self.sussanClub:
            self.puntosDineroTxt.Show()
            self.puntosTxt.Show()
            self.staticText16.Show()
            self.agregarPuntosBtn.Show()
        else:
            self.puntosDineroTxt.Hide()
            self.puntosTxt.Hide()
            self.staticText16.Hide()
            self.agregarPuntosBtn.Hide()

    def OnAgregarPuntosBtnButton(self, event):
        try:
            money = float(self.puntosDineroTxt.GetValue())
            if not money: return
            
            Pagos.agregarPagoPuntos(self.grid2, money)
            self.puntosDineroTxt.SetValue('0.0')
            self.puntosTxt.SetValue('0')
            
            vaPagando = Pagos.getTotalEnPago(self.grid2)
            self.inpagando.ChangeValue(str(vaPagando))
        except sussanException.SussanException, e:
            utiles.mensaje(self, e.message) 

    def OnHistorioPagos(self, event):
        dlg = ListadoPagosMigracion.Dialog1(self,self.incodigo.GetLabel())
        print "Historico de saldos de clientes"
        try:
            dlg.ShowModal()
        finally:
            dlg.Destroy() 

    def OnDetalleFacturas(self, event):
        dlg = ListadoFacturas.Dialog1(self,self.incodigo.GetLabel(),\
                                      self.inapellido.GetLabel(),self.inemail.GetLabel())
        print "Detalle de facturas del cliente"
        try:
            dlg.ShowModal()
        finally:
            dlg.Destroy() 

    def OnCrearSenia(self, event):
        import VentasSenias
        incodigo = self.incodigo.GetLabel()
        inapellido = self.inapellido.GetLabel()
        idvendedora = self.invendedora.GetLabel()
        if incodigo == "" and inapellido=="":
            utiles.mensaje(None,"Debe seleccionar un cliente")
            return
        if incodigo == "1-2":
            utiles.mensaje(None,"El cliente 1-2 no puede seniar")
            return
        vendedora = self.comboVendedora.GetLabel()
        if vendedora == "Vendedoras...":
            utiles.mensaje(None,"Debe especificar nombre vendedora")
            return
        dlg = VentasSenias.Dialog1(self, incodigo, inapellido, vendedora, idvendedora)
        try:
            dlg.ShowModal()
        finally:
            dlg.Destroy() 

    def OnFacturarSenia(self, event):
        import VentasSeniasFacturacion
        incodigo = self.incodigo.GetLabel()
        inapellido = self.inapellido.GetLabel()
        idvendedora = self.invendedora.GetLabel()
        vendedora = self.comboVendedora.GetLabel()
        if incodigo == "" and inapellido=="":
            utiles.mensaje(None,"Debe seleccionar un cliente")
            return
        if incodigo == "1-2":
            utiles.mensaje(None,"El cliente 1-2 no puede seniar")
            return
        if vendedora == "Vendedoras...":
            utiles.mensaje(None,"Debe especificar nombre vendedora")
            return
        dlg = VentasSeniasFacturacion.Dialog1(self, incodigo, inapellido, vendedora, idvendedora)
        try:
            dlg.ShowModal()
            listaPTC = dlg.getDatosSenias()
        finally:
            dlg.Destroy() 
        if listaPTC==[]:
            return

        self.grid1.ClearGrid()
        self.grid1.SetGridCursor(0,0)
        #self.grid1.SetSelectionMode(wx.grid.Grid.wxGridSelectRows)
        #self.grid1.EnableEditing(False)
        self.button7.Enable(False)
        self.button8.Enable(False)

        for fil,datos in enumerate(listaPTC):
            ptc = datos["ptc"]
            codsussan = datos["codsussan"]
            descripcion = datos["descripcion"]
            talle = datos["talle"]
            color = datos["color"]
            cantidad = datos["cantidad"]
            preciounitario = datos["preciounitario"]
            subtotal = datos["subtotal"]

            self.grid1.SetCellValue(fil,0,ptc)
            self.grid1.SetCellValue(fil,1,codsussan)
            self.grid1.SetCellValue(fil,2,descripcion)
            self.grid1.SetCellValue(fil,3,talle)
            self.grid1.SetCellValue(fil,4,color)
            self.grid1.SetCellValue(fil,5,cantidad)
            self.grid1.SetCellValue(fil,6,preciounitario)
            self.grid1.SetCellValue(fil,7,subtotal)
            self.grid1.SetCellValue(fil,8,"0.00")
            self.grid1.SetCellValue(fil,9,subtotal)

        self.actualizaSubtotal()
        self.grid1.ForceRefresh()
